digitalkin 1.0.5.dev2__tar.gz → 1.0.5.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 (275) hide show
  1. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/PKG-INFO +2 -2
  2. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/services/filesystem_module.py +7 -6
  3. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/pyproject.toml +45 -45
  4. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/__version__.py +1 -1
  5. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/action.py +47 -15
  6. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/base.py +15 -10
  7. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +1 -1
  8. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +1 -1
  9. digitalkin-1.0.5.dev3/src/digitalkin/community/agno/toolkits/registry/services/action.py +175 -0
  10. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +11 -5
  11. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/job_manager/single_job_manager.py +1 -1
  12. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/profiling/task_profiler.py +3 -3
  13. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/resilience/bulkhead.py +5 -6
  14. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/base_task_manager.py +1 -1
  15. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/local_task_manager.py +1 -1
  16. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/module_runner.py +6 -6
  17. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/redis/proto_streams.py +2 -2
  18. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/redis/redis_client.py +1 -1
  19. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/redis/redis_signal.py +7 -7
  20. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/remote_task_manager.py +1 -1
  21. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/task_executor.py +3 -3
  22. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/_base_server.py +15 -15
  23. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/gateway_servicer.py +21 -21
  24. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/interceptors/permission.py +9 -9
  25. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/interceptors/request_ids.py +1 -1
  26. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/m2m_call_registry.py +2 -2
  27. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/module_server.py +19 -10
  28. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/module_servicer.py +30 -15
  29. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +3 -3
  30. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +7 -7
  31. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +1 -1
  32. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +2 -2
  33. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/validators.py +1 -1
  34. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/logger.py +1 -1
  35. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/agui_mixin.py +1 -1
  36. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/file_history_mixin.py +4 -3
  37. digitalkin-1.0.5.dev3/src/digitalkin/mixins/filesystem_mixin.py +220 -0
  38. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/models.py +30 -39
  39. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/__init__.py +6 -0
  40. digitalkin-1.0.5.dev3/src/digitalkin/models/module/knowledge_files.py +87 -0
  41. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/module_context.py +1 -1
  42. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/setup_types.py +1 -1
  43. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/services/__init__.py +4 -0
  44. digitalkin-1.0.5.dev3/src/digitalkin/models/services/filesystem.py +127 -0
  45. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/services/registry.py +3 -0
  46. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/services/storage.py +3 -9
  47. digitalkin-1.0.5.dev3/src/digitalkin/models/settings/certificate.py +90 -0
  48. digitalkin-1.0.5.dev3/src/digitalkin/models/settings/client/__init__.py +1 -0
  49. digitalkin-1.0.5.dev3/src/digitalkin/models/settings/client/channel.py +68 -0
  50. digitalkin-1.0.5.dev3/src/digitalkin/models/settings/client/circuit_breaker.py +19 -0
  51. digitalkin-1.0.5.dev3/src/digitalkin/models/settings/client/client.py +55 -0
  52. digitalkin-1.0.5.dev3/src/digitalkin/models/settings/client/grpc.py +148 -0
  53. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/module.py +17 -2
  54. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/profiling.py +1 -1
  55. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/redis.py +5 -1
  56. digitalkin-1.0.5.dev3/src/digitalkin/models/settings/resilience.py +61 -0
  57. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/server/channel.py +23 -3
  58. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/server/grpc.py +1 -1
  59. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/server/server.py +4 -2
  60. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/utils/channel.py +46 -8
  61. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/_base_module.py +7 -7
  62. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/trigger_handler.py +1 -1
  63. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +2 -2
  64. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +3 -3
  65. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +2 -2
  66. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/communication/communication_strategy.py +1 -1
  67. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/communication/default_communication.py +5 -5
  68. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/communication/exceptions.py +2 -2
  69. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/communication/grpc_communication.py +6 -6
  70. digitalkin-1.0.5.dev3/src/digitalkin/services/filesystem/__init__.py +19 -0
  71. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/filesystem/default_filesystem.py +42 -35
  72. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/filesystem/filesystem_strategy.py +49 -49
  73. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/filesystem/grpc_filesystem.py +18 -40
  74. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/identity/default_identity.py +1 -1
  75. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/default_registry.py +5 -2
  76. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/grpc_registry.py +3 -2
  77. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/registry_strategy.py +2 -2
  78. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/services_config.py +16 -4
  79. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/setup/default_setup.py +66 -6
  80. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/setup/grpc_setup.py +65 -17
  81. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/setup/setup_strategy.py +43 -6
  82. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/storage/default_storage.py +1 -1
  83. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/task_manager/default_task_manager.py +4 -4
  84. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/user_profile/default_user_profile.py +1 -1
  85. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/arg_parser.py +6 -6
  86. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/development_mode_action.py +12 -20
  87. digitalkin-1.0.5.dev3/src/digitalkin/utils/env_manager.py +139 -0
  88. digitalkin-1.0.5.dev3/src/digitalkin/utils/env_template.py +233 -0
  89. digitalkin-1.0.5.dev3/src/digitalkin/utils/json_structure.py +169 -0
  90. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/llm_ready_schema.py +1 -1
  91. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/package_discover.py +3 -3
  92. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/schema_splitter.py +4 -4
  93. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin.egg-info/PKG-INFO +2 -2
  94. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin.egg-info/SOURCES.txt +11 -1
  95. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin.egg-info/requires.txt +1 -1
  96. digitalkin-1.0.5.dev2/src/digitalkin/community/agno/toolkits/registry/services/action.py +0 -92
  97. digitalkin-1.0.5.dev2/src/digitalkin/mixins/filesystem_mixin.py +0 -46
  98. digitalkin-1.0.5.dev2/src/digitalkin/models/settings/grpc_client.py +0 -127
  99. digitalkin-1.0.5.dev2/src/digitalkin/models/settings/resilience.py +0 -31
  100. digitalkin-1.0.5.dev2/src/digitalkin/services/filesystem/__init__.py +0 -7
  101. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/LICENSE +0 -0
  102. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/README.md +0 -0
  103. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/base_server/__init__.py +0 -0
  104. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/base_server/mock/__init__.py +0 -0
  105. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/base_server/mock/mock_pb2.py +0 -0
  106. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  107. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/base_server/server_async_insecure.py +0 -0
  108. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/base_server/server_async_secure.py +0 -0
  109. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/base_server/server_sync_insecure.py +0 -0
  110. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/base_server/server_sync_secure.py +0 -0
  111. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/bench_module/__init__.py +0 -0
  112. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/bench_module/echo_module.py +0 -0
  113. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/bench_module/models/__init__.py +0 -0
  114. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/bench_module/models/input.py +0 -0
  115. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/bench_module/models/output.py +0 -0
  116. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/bench_module/models/secret.py +0 -0
  117. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/bench_module/models/setup.py +0 -0
  118. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/bench_module/server.py +0 -0
  119. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/bench_module/triggers/__init__.py +0 -0
  120. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/bench_module/triggers/message_trigger.py +0 -0
  121. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/modules/__init__.py +0 -0
  122. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/modules/archetype_with_tools_module.py +0 -0
  123. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/modules/cpu_intensive_module.py +0 -0
  124. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/modules/dynamic_setup_module.py +0 -0
  125. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/modules/minimal_llm_module.py +0 -0
  126. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/modules/text_transform_module.py +0 -0
  127. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  128. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  129. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  130. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  131. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  132. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/monitoring/tests/test_metrics.py +0 -0
  133. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/redis_demo/client.py +0 -0
  134. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/redis_demo/echo_module.py +0 -0
  135. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/redis_demo/models/__init__.py +0 -0
  136. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/redis_demo/models/input.py +0 -0
  137. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/redis_demo/models/output.py +0 -0
  138. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/redis_demo/models/secret.py +0 -0
  139. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/redis_demo/models/setup.py +0 -0
  140. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/redis_demo/server.py +0 -0
  141. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/redis_demo/triggers/__init__.py +0 -0
  142. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/redis_demo/triggers/message_trigger.py +0 -0
  143. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/examples/services/storage_module.py +0 -0
  144. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/setup.cfg +0 -0
  145. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/__init__.py +0 -0
  146. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/__init__.py +0 -0
  147. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/__init__.py +0 -0
  148. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/agno_adapter.py +0 -0
  149. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/agui_tools.py +0 -0
  150. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/hitl.py +0 -0
  151. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/models.py +0 -0
  152. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/module_toolkit.py +0 -0
  153. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
  154. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/base.py +0 -0
  155. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/chat_history.py +0 -0
  156. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
  157. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
  158. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
  159. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +0 -0
  160. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +0 -0
  161. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
  162. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
  163. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
  164. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +0 -0
  165. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +0 -0
  166. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/user_profile.py +0 -0
  167. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/__init__.py +0 -0
  168. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/common/__init__.py +0 -0
  169. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/common/factories.py +0 -0
  170. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/exceptions.py +0 -0
  171. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/job_manager/__init__.py +0 -0
  172. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  173. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/profiling/__init__.py +0 -0
  174. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/profiling/step_timer.py +0 -0
  175. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/resilience/__init__.py +0 -0
  176. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  177. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/__init__.py +0 -0
  178. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
  179. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
  180. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/task_session.py +0 -0
  181. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/exceptions.py +0 -0
  182. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/__init__.py +0 -0
  183. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/exceptions.py +0 -0
  184. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  185. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
  186. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/stream_session.py +0 -0
  187. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  188. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/__init__.py +0 -0
  189. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/base_mixin.py +0 -0
  190. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/cost_mixin.py +0 -0
  191. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/logger_mixin.py +0 -0
  192. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/storage_mixin.py +0 -0
  193. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/__init__.py +0 -0
  194. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/core/__init__.py +0 -0
  195. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/core/job_manager_models.py +0 -0
  196. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/core/redis.py +0 -0
  197. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/core/task_monitor.py +0 -0
  198. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/events/__init__.py +0 -0
  199. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/events/agent_events.py +0 -0
  200. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  201. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
  202. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
  203. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
  204. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/types.py +0 -0
  205. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/ag_ui.py +0 -0
  206. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/base_types.py +0 -0
  207. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/loaded_tools.py +0 -0
  208. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/module.py +0 -0
  209. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/module_types.py +0 -0
  210. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/request_metadata.py +0 -0
  211. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/select_schema.py +0 -0
  212. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/tool_cache.py +0 -0
  213. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/tool_reference.py +0 -0
  214. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/utility.py +0 -0
  215. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/services/cost.py +0 -0
  216. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/services/services.py +0 -0
  217. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/__init__.py +0 -0
  218. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/gateway.py +0 -0
  219. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/log.py +0 -0
  220. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/queue.py +0 -0
  221. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/registry.py +0 -0
  222. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/server/__init__.py +0 -0
  223. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/server/servicer.py +0 -0
  224. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/task_manager.py +0 -0
  225. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  226. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/utils/__init__.py +0 -0
  227. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
  228. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/__init__.py +0 -0
  229. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/archetype_module.py +0 -0
  230. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/tool_module.py +0 -0
  231. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/triggers/__init__.py +0 -0
  232. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/py.typed +0 -0
  233. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/__init__.py +0 -0
  234. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/base_strategy.py +0 -0
  235. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/communication/__init__.py +0 -0
  236. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/cost/__init__.py +0 -0
  237. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  238. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/cost/default_cost.py +0 -0
  239. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/cost/exceptions.py +0 -0
  240. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  241. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/filesystem/exceptions.py +0 -0
  242. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/identity/__init__.py +0 -0
  243. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  244. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/__init__.py +0 -0
  245. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/exceptions.py +0 -0
  246. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/registry_models.py +0 -0
  247. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/secret/__init__.py +0 -0
  248. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/secret/default_secret.py +0 -0
  249. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/secret/exceptions.py +0 -0
  250. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/secret/grpc_secret.py +0 -0
  251. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/secret/secret_strategy.py +0 -0
  252. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/services_models.py +0 -0
  253. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/setup/__init__.py +0 -0
  254. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/setup/exceptions.py +0 -0
  255. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/storage/__init__.py +0 -0
  256. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/storage/exceptions.py +0 -0
  257. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/storage/grpc_storage.py +0 -0
  258. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  259. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/task_manager/__init__.py +0 -0
  260. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/task_manager/exceptions.py +0 -0
  261. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  262. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  263. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/user_profile/__init__.py +0 -0
  264. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/user_profile/exceptions.py +0 -0
  265. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
  266. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  267. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/__init__.py +0 -0
  268. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/conditional_schema.py +0 -0
  269. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/dynamic_schema.py +0 -0
  270. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/exceptions.py +0 -0
  271. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/proto_utils.py +0 -0
  272. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/setup_content_validator.py +0 -0
  273. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  274. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev3}/src/digitalkin.egg-info/top_level.txt +0 -0
  275. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.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.5.dev2
3
+ Version: 1.0.5.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.1
456
+ Requires-Dist: agentic-mesh-protocol==1.0.2
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
@@ -10,7 +10,8 @@ from pydantic import BaseModel, Field
10
10
  from digitalkin.logger import logger
11
11
  from digitalkin.models.module import ModuleStatus
12
12
  from digitalkin.modules.archetype_module import ArchetypeModule
13
- from digitalkin.services.filesystem.filesystem_strategy import FileFilter, UploadFileData
13
+ from digitalkin.models.services.filesystem import FileType
14
+ from digitalkin.services.filesystem import FileFilter, UploadFileData
14
15
  from digitalkin.services.services_config import ServicesConfig
15
16
  from digitalkin.services.services_models import ServicesMode
16
17
 
@@ -118,9 +119,9 @@ class ExampleModule(ArchetypeModule[ExampleInput, ExampleOutput, ExampleSetup, E
118
119
  file = UploadFileData(
119
120
  content=b"%s\n%s" % (processed_message.encode(), str(processed_number).encode()),
120
121
  name="example_output.txt",
121
- file_type="text/plain",
122
+ type=FileType.DOCUMENT,
122
123
  content_type="text/plain",
123
- metadata={"example_key": "example_value"},
124
+ metadata={"sdk_created": True},
124
125
  replace_if_exists=True,
125
126
  )
126
127
 
@@ -176,10 +177,10 @@ async def test_module() -> None:
176
177
  # Check the storage
177
178
  if module.status == ModuleStatus.STOPPED:
178
179
  files, _nb_results = await module.filesystem.get_files(
179
- filters=FileFilter(name="example_output.txt", context="test-mission-123"),
180
+ filters=FileFilter(names=["example_output.txt"]),
180
181
  )
181
182
  for file in files:
182
- await module.filesystem.update_file(file.id, file_type="updated")
183
+ await module.filesystem.update_file(file.id, type=FileType.OTHER)
183
184
  # module.filesystem.delete_files(filters=FileFilter(name="example_output.txt", context="test-mission-123"), permanent=True)
184
185
 
185
186
  logger.info("Retrieved file: %s with ID: %s", file.name, file.id)
@@ -188,7 +189,7 @@ async def test_module() -> None:
188
189
  if file_record:
189
190
  logger.info("File ID: %s", file_record.id)
190
191
  logger.info("File name: %s", file_record.name)
191
- logger.info("File type: %s", file_record.file_type)
192
+ logger.info("File type: %s", file_record.type)
192
193
  logger.info("File status: %s", file_record.status)
193
194
  logger.info("File content: %s", file_record.content.decode())
194
195
  except Exception:
@@ -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.1",
34
+ "agentic-mesh-protocol==1.0.2",
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.5.dev2"
44
+ version = "1.0.5.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
- "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
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
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
- "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",
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",
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.5.dev2"
8
+ __version__ = "1.0.5.dev3"
@@ -23,6 +23,7 @@ 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
26
27
 
27
28
 
28
29
  class GetAction(RegistryAction):
@@ -124,23 +125,36 @@ class SearchAction(RegistryAction):
124
125
  # would both contradict ``total_returned`` and, at exactly ``cap`` rows, promise an empty
125
126
  # next page.
126
127
  truncated = len(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
- ]
128
+ rows = [self._row(setup) for setup in usable[:cap]]
142
129
  return {"total_returned": len(rows), "truncated": truncated, "offset": self.offset, "setups": rows}
143
130
 
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
+
144
158
 
145
159
  class UpdateAction(RegistryAction):
146
160
  """Update an instance: cut a new version of its configuration, and rename it.
@@ -166,6 +180,20 @@ class UpdateAction(RegistryAction):
166
180
  "without changing what the instance currently serves, then activate it later with "
167
181
  "``set_version``.",
168
182
  )
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 {}
169
197
 
170
198
  async def execute(self, ctx: RegistryActionCtx) -> Any:
171
199
  """Cut a new version of the setup's content and rename it.
@@ -184,6 +212,10 @@ class UpdateAction(RegistryAction):
184
212
  "name": self.name,
185
213
  "content": self.content,
186
214
  "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(),
187
219
  })
188
220
 
189
221
 
@@ -171,22 +171,23 @@ class RegistryAction(BaseAction[RegistryActionCtx], ABC):
171
171
 
172
172
  writes: ClassVar[bool] = False
173
173
 
174
- @field_validator("name", check_fields=False)
174
+ @field_validator("name", "documentation", check_fields=False)
175
175
  @classmethod
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.
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.
178
178
 
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).
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.
182
183
 
183
184
  Returns:
184
- The name unchanged when clean.
185
+ The value unchanged when clean.
185
186
 
186
187
  Raises:
187
- ValueError: The name carries a control character.
188
+ ValueError: The value carries a control character.
188
189
  """
189
- return SetupContentValidator.reject_control_chars(value)
190
+ return value if value is None else SetupContentValidator.reject_control_chars(value)
190
191
 
191
192
  @field_validator("content", check_fields=False)
192
193
  @classmethod
@@ -346,7 +347,11 @@ class RegistryObjectToolKit(DkToolkit):
346
347
  Also echoes ``visibility`` back in the caller's vocabulary — the input enum is
347
348
  ``public``/``private``/``internal`` but the backend returns the proto name
348
349
  ``VISIBILITY_INTERNAL``, so a naive round-trip fails. Strip the prefix and
349
- lower-case it so the field read back matches the field written.
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.
350
355
 
351
356
  Args:
352
357
  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: # noqa: C901, PLR0911 — each return is a distinct, LLM-readable outcome
137
+ async def execute(self, ctx: LoadActionCtx) -> LoadOutcome: # ruff: ignore[complex-structure, too-many-return-statements] — 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: # noqa: ARG002 — schema-only stub, never run
66
+ async def load_manager(self, action: LoadActions) -> str: # ruff: ignore[unused-method-argument] — 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,175 @@
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
+ - ``structure`` — show a service's key paths and what lives at each, without its content;
7
+ - ``load`` — return the service's stored JSON configuration content, whole or one key of
8
+ it (distinct from Tool.load, which loads a live tool into the agent).
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from typing import TYPE_CHECKING, Annotated, Any, ClassVar, Literal
14
+
15
+ from pydantic import Field
16
+
17
+ from digitalkin.community.agno.toolkits.registry.action import (
18
+ ChangeVisibilityAction,
19
+ DeleteAction,
20
+ GetAction,
21
+ ListVersionsAction,
22
+ SearchAction,
23
+ SetVersionAction,
24
+ UpdateAction,
25
+ )
26
+ from digitalkin.community.agno.toolkits.registry.base import RegistryAction
27
+
28
+ if TYPE_CHECKING:
29
+ from digitalkin.community.agno.toolkits.registry.base import RegistryActionCtx
30
+
31
+
32
+ class CreateServiceAction(RegistryAction):
33
+ """Create a shareable service other kins can discover.
34
+
35
+ Only a name and the configuration JSON are needed — owner, organisation and kind
36
+ are derived server-side. Once created it is discoverable via ``search`` and
37
+ readable via ``load``.
38
+ The service is always created *private* (owner only): visibility is not a creation
39
+ parameter. Widening it to ``internal`` (whole organisation) or ``public`` (everyone)
40
+ requires a separate ``change_visibility`` call.
41
+ """
42
+
43
+ action: Literal["create"] = "create"
44
+ writes: ClassVar[bool] = True
45
+ name: str = Field(..., description="Human-readable service name.")
46
+ content: dict[str, Any] = Field(
47
+ ...,
48
+ min_length=1,
49
+ description="The service configuration (a non-empty JSON object). "
50
+ "Note: JSON numbers round-trip as floats over the wire.",
51
+ )
52
+ documentation: str = Field(
53
+ default="",
54
+ description="Free text describing what this service is for and when to use it. It is "
55
+ "what ``search`` matches on and previews back, so a service created without it is "
56
+ "findable only by name.",
57
+ )
58
+ structure: dict[str, str] = Field(
59
+ ...,
60
+ description="Map of key path -> one-line summary of what lives at it. This is what "
61
+ "another agent reads to decide which part of the configuration to fetch, so summarise "
62
+ "what the key is FOR, not what its value is, and keep every line far shorter than the "
63
+ "content it describes. Cover each key worth finding on its own; point at a whole "
64
+ "section instead when it is only ever read as a unit. Path syntax: join nested keys "
65
+ 'with "." (llm.model); bracket-quote a key containing . [ ] " or \\ '
66
+ '(limits["max.tokens"]); index a list element (tools[0]). Keep each description under '
67
+ "512 characters — longer ones are trimmed.",
68
+ )
69
+
70
+ async def execute(self, ctx: RegistryActionCtx) -> Any:
71
+ """Create the service setup from its name, content, documentation and authored key map.
72
+
73
+ Returns:
74
+ The created service setup.
75
+ """
76
+ return await ctx.setup.create_service_setup(
77
+ self.name, self.content, documentation=self.documentation, structure=self.structure
78
+ )
79
+
80
+
81
+ class StructureServiceAction(RegistryAction):
82
+ """Show a service's shape — key paths and what lives at each — without its content.
83
+
84
+ Use it on a setup id you already hold; ``search`` already returns the same map on
85
+ every row, so there is no need to call this straight after a search. Feed a key from
86
+ it to ``load`` to read just that part of the configuration.
87
+ """
88
+
89
+ action: Literal["structure"] = "structure"
90
+ setup_id: str = Field(..., description="The service setup id whose shape to show.")
91
+
92
+ async def execute(self, ctx: RegistryActionCtx) -> Any:
93
+ """Return the stored ``{key path: summary}`` map, with no configuration content.
94
+
95
+ The map is written by whoever created or updated the setup, and the only read that
96
+ carries it is the setup search — so this restates a search for one id rather than
97
+ deriving a map locally, which would discard the written summaries. A setup stored
98
+ before the map existed returns an empty one.
99
+
100
+ Returns:
101
+ The key map, or an empty dict when the setup carries none.
102
+ """
103
+ await ctx.ensure_kind(self.setup_id)
104
+ found = await ctx.registry.search_setups(setup_ids=[self.setup_id], module_types=[ctx.module_type], limit=1)
105
+ return found[0].structure if found else {}
106
+
107
+
108
+ class LoadServiceAction(RegistryAction):
109
+ """Load a service's configuration — one key from its structure, or the whole document."""
110
+
111
+ action: Literal["load"] = "load"
112
+ setup_id: str = Field(..., description="The service setup id to load (from a search result).")
113
+ key: str | None = Field(
114
+ default=None,
115
+ description="One key path copied verbatim from the service's structure map, to read just "
116
+ "that part of the configuration. Copy it, do not compose it: a key the configuration "
117
+ "does not have is not an error, it returns the whole document. Omit the key to load "
118
+ "everything deliberately, when the configuration is small or genuinely needed in full.",
119
+ )
120
+
121
+ async def execute(self, ctx: RegistryActionCtx) -> Any:
122
+ """Return the service's configuration content, or the part ``key`` names.
123
+
124
+ Guards the object type first: without it ``load`` would happily return a tool's
125
+ internal configuration — the most dangerous type-confusion, since the response
126
+ carries no field the caller could use to notice it read the wrong kind. The read
127
+ itself passes ``key`` to the setup service, so the narrowing happens where the
128
+ document lives; a key the configuration does not have returns the whole document
129
+ rather than an error, which is what the wire does.
130
+
131
+ Returns:
132
+ ``{key: value}`` for a key that resolves, otherwise the whole configuration.
133
+ """
134
+ await ctx.ensure_kind(self.setup_id)
135
+ setup = await ctx.setup.get_setup({"setup_id": self.setup_id, "structure_key": self.key or ""})
136
+ return setup.current_setup_version.content
137
+
138
+
139
+ class UpdateServiceAction(UpdateAction):
140
+ """Update a service, refreshing the key map alongside the configuration.
141
+
142
+ The map belongs to the content it describes, so a new revision needs a new one; the
143
+ stored map is replaced by whatever this call carries.
144
+ """
145
+
146
+ structure: dict[str, str] | None = Field(
147
+ default=None,
148
+ description="Refreshed map of key path -> one-line description of what lives at that "
149
+ "leaf, describing the content this call carries. Same form and same 512-character limit "
150
+ "as on create. Omitting it leaves the new revision without a map, so other agents can no "
151
+ "longer see the service's shape — resupply it whenever the service had one.",
152
+ )
153
+
154
+ def _type_payload(self) -> dict[str, Any]:
155
+ """Carry the refreshed map onto the new revision.
156
+
157
+ Returns:
158
+ The ``structure`` entry for the update payload.
159
+ """
160
+ return {"structure": self.structure}
161
+
162
+
163
+ ServiceActions = Annotated[
164
+ GetAction
165
+ | CreateServiceAction
166
+ | SearchAction
167
+ | StructureServiceAction
168
+ | LoadServiceAction
169
+ | UpdateServiceAction
170
+ | DeleteAction
171
+ | ChangeVisibilityAction
172
+ | ListVersionsAction
173
+ | SetVersionAction,
174
+ Field(discriminator="action"),
175
+ ]
@@ -37,11 +37,17 @@ class ServicesManager(RegistryObjectToolKit):
37
37
  name="services_manager",
38
38
  actions=ServiceActions,
39
39
  description=(
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."
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."
45
51
  ),
46
52
  entrypoint=self.services_manager,
47
53
  )
@@ -197,7 +197,7 @@ class SingleJobManager(BaseJobManager[InputModelT, OutputModelT, SetupModelT]):
197
197
  data = output_data.model_dump(mode="json")
198
198
 
199
199
  # Lock guards only the session validity check; queue.put() runs outside.
200
- async with session._write_lock: # noqa: SLF001
200
+ async with session._write_lock: # ruff: ignore[private-member-access]
201
201
  if job_id not in self.tasks_sessions and job_id not in self._config_sessions:
202
202
  logger.debug("Queue write rejected - session removed during lock wait", extra={"job_id": job_id})
203
203
  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: # noqa: PERF203
58
+ except OSError: # ruff: ignore[try-except-in-loop]
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: # noqa: PLW0717
66
+ try: # ruff: ignore[too-many-statements-in-try-clause]
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: # noqa: PLW0717
103
+ try: # ruff: ignore[too-many-statements-in-try-clause]
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,
@@ -86,7 +86,7 @@ class BaseTaskManager(ABC):
86
86
  session = self.tasks_sessions.get(task_id)
87
87
  if session is not None:
88
88
  # Close stream under the write lock so pending writes see stream_closed.
89
- async with session._write_lock: # noqa: SLF001
89
+ async with session._write_lock: # ruff: ignore[private-member-access]
90
90
  session.close_stream()
91
91
 
92
92
  session = self.tasks_sessions.pop(task_id, None)
@@ -48,7 +48,7 @@ class LocalTaskManager(BaseTaskManager):
48
48
  """
49
49
  await self._acquire_task_slot(coro)
50
50
  registered = False
51
- try: # noqa: PLW0717
51
+ try: # ruff: ignore[too-many-statements-in-try-clause]
52
52
  async with self._tasks_lock:
53
53
  await self._validate_task_creation(task_id, mission_id, coro)
54
54
  session = self._create_session(task_id, mission_id, module)