digitalkin 1.0.5.dev2__tar.gz → 1.0.5.dev4__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 (277) hide show
  1. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/PKG-INFO +2 -2
  2. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/services/filesystem_module.py +7 -6
  3. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/pyproject.toml +45 -45
  4. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/__version__.py +1 -1
  5. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/agno_adapter.py +20 -0
  6. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/hitl.py +27 -5
  7. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/module_toolkit.py +21 -4
  8. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/action.py +47 -15
  9. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/base.py +15 -10
  10. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +1 -1
  11. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +1 -1
  12. digitalkin-1.0.5.dev4/src/digitalkin/community/agno/toolkits/registry/services/action.py +175 -0
  13. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +11 -5
  14. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/job_manager/single_job_manager.py +1 -1
  15. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/profiling/task_profiler.py +3 -3
  16. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/resilience/bulkhead.py +5 -6
  17. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/base_task_manager.py +1 -1
  18. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/local_task_manager.py +1 -1
  19. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/module_runner.py +46 -8
  20. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/redis/proto_streams.py +2 -2
  21. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/redis/redis_client.py +1 -1
  22. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/redis/redis_signal.py +7 -7
  23. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/remote_task_manager.py +1 -1
  24. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/task_executor.py +3 -3
  25. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/_base_server.py +15 -15
  26. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/gateway_servicer.py +21 -21
  27. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/interceptors/permission.py +9 -9
  28. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/interceptors/request_ids.py +1 -1
  29. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/m2m_call_registry.py +2 -2
  30. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/module_server.py +19 -10
  31. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/module_servicer.py +30 -15
  32. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +3 -3
  33. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +7 -7
  34. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +1 -1
  35. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +2 -2
  36. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/validators.py +1 -1
  37. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/logger.py +1 -1
  38. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/agui_mixin.py +176 -10
  39. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/file_history_mixin.py +4 -3
  40. digitalkin-1.0.5.dev4/src/digitalkin/mixins/filesystem_mixin.py +220 -0
  41. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/models.py +30 -39
  42. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/__init__.py +6 -0
  43. digitalkin-1.0.5.dev4/src/digitalkin/models/module/knowledge_files.py +87 -0
  44. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/module_context.py +7 -2
  45. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/setup_types.py +1 -1
  46. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/utility.py +6 -0
  47. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/services/__init__.py +4 -0
  48. digitalkin-1.0.5.dev4/src/digitalkin/models/services/filesystem.py +127 -0
  49. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/services/registry.py +3 -0
  50. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/services/storage.py +3 -9
  51. digitalkin-1.0.5.dev4/src/digitalkin/models/settings/certificate.py +90 -0
  52. digitalkin-1.0.5.dev4/src/digitalkin/models/settings/client/__init__.py +1 -0
  53. digitalkin-1.0.5.dev4/src/digitalkin/models/settings/client/channel.py +68 -0
  54. digitalkin-1.0.5.dev4/src/digitalkin/models/settings/client/circuit_breaker.py +19 -0
  55. digitalkin-1.0.5.dev4/src/digitalkin/models/settings/client/client.py +55 -0
  56. digitalkin-1.0.5.dev4/src/digitalkin/models/settings/client/grpc.py +148 -0
  57. digitalkin-1.0.5.dev4/src/digitalkin/models/settings/module.py +54 -0
  58. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/profiling.py +1 -1
  59. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/redis.py +5 -1
  60. digitalkin-1.0.5.dev4/src/digitalkin/models/settings/resilience.py +61 -0
  61. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/server/channel.py +23 -3
  62. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/server/grpc.py +1 -1
  63. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/server/server.py +4 -2
  64. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/utils/channel.py +46 -8
  65. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/_base_module.py +27 -11
  66. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/trigger_handler.py +1 -1
  67. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +2 -2
  68. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +3 -3
  69. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +2 -2
  70. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/communication/communication_strategy.py +1 -1
  71. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/communication/default_communication.py +5 -5
  72. digitalkin-1.0.5.dev4/src/digitalkin/services/communication/exceptions.py +20 -0
  73. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/communication/grpc_communication.py +17 -14
  74. digitalkin-1.0.5.dev4/src/digitalkin/services/filesystem/__init__.py +19 -0
  75. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/filesystem/default_filesystem.py +42 -35
  76. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/filesystem/filesystem_strategy.py +49 -49
  77. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/filesystem/grpc_filesystem.py +18 -40
  78. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/identity/default_identity.py +1 -1
  79. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/default_registry.py +5 -2
  80. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/grpc_registry.py +3 -2
  81. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/registry_strategy.py +2 -2
  82. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/services_config.py +16 -4
  83. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/setup/default_setup.py +66 -6
  84. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/setup/grpc_setup.py +65 -17
  85. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/setup/setup_strategy.py +43 -6
  86. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/storage/default_storage.py +1 -1
  87. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/task_manager/default_task_manager.py +4 -4
  88. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/user_profile/default_user_profile.py +1 -1
  89. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/arg_parser.py +6 -6
  90. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/development_mode_action.py +12 -20
  91. digitalkin-1.0.5.dev4/src/digitalkin/utils/env_manager.py +139 -0
  92. digitalkin-1.0.5.dev4/src/digitalkin/utils/env_template.py +233 -0
  93. digitalkin-1.0.5.dev4/src/digitalkin/utils/json_structure.py +169 -0
  94. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/llm_ready_schema.py +1 -1
  95. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/package_discover.py +3 -3
  96. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/schema_splitter.py +4 -4
  97. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin.egg-info/PKG-INFO +2 -2
  98. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin.egg-info/SOURCES.txt +11 -1
  99. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin.egg-info/requires.txt +1 -1
  100. digitalkin-1.0.5.dev2/src/digitalkin/community/agno/toolkits/registry/services/action.py +0 -92
  101. digitalkin-1.0.5.dev2/src/digitalkin/mixins/filesystem_mixin.py +0 -46
  102. digitalkin-1.0.5.dev2/src/digitalkin/models/settings/grpc_client.py +0 -127
  103. digitalkin-1.0.5.dev2/src/digitalkin/models/settings/module.py +0 -31
  104. digitalkin-1.0.5.dev2/src/digitalkin/models/settings/resilience.py +0 -31
  105. digitalkin-1.0.5.dev2/src/digitalkin/services/communication/exceptions.py +0 -17
  106. digitalkin-1.0.5.dev2/src/digitalkin/services/filesystem/__init__.py +0 -7
  107. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/LICENSE +0 -0
  108. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/README.md +0 -0
  109. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/__init__.py +0 -0
  110. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/mock/__init__.py +0 -0
  111. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/mock/mock_pb2.py +0 -0
  112. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  113. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/server_async_insecure.py +0 -0
  114. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/server_async_secure.py +0 -0
  115. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/server_sync_insecure.py +0 -0
  116. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/server_sync_secure.py +0 -0
  117. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/__init__.py +0 -0
  118. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/echo_module.py +0 -0
  119. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/models/__init__.py +0 -0
  120. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/models/input.py +0 -0
  121. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/models/output.py +0 -0
  122. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/models/secret.py +0 -0
  123. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/models/setup.py +0 -0
  124. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/server.py +0 -0
  125. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/triggers/__init__.py +0 -0
  126. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/triggers/message_trigger.py +0 -0
  127. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/__init__.py +0 -0
  128. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/archetype_with_tools_module.py +0 -0
  129. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/cpu_intensive_module.py +0 -0
  130. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/dynamic_setup_module.py +0 -0
  131. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/minimal_llm_module.py +0 -0
  132. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/text_transform_module.py +0 -0
  133. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  134. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  135. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  136. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  137. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  138. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/tests/test_metrics.py +0 -0
  139. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/client.py +0 -0
  140. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/echo_module.py +0 -0
  141. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/models/__init__.py +0 -0
  142. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/models/input.py +0 -0
  143. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/models/output.py +0 -0
  144. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/models/secret.py +0 -0
  145. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/models/setup.py +0 -0
  146. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/server.py +0 -0
  147. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/triggers/__init__.py +0 -0
  148. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/triggers/message_trigger.py +0 -0
  149. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/services/storage_module.py +0 -0
  150. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/setup.cfg +0 -0
  151. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/__init__.py +0 -0
  152. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/__init__.py +0 -0
  153. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/__init__.py +0 -0
  154. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/agui_tools.py +0 -0
  155. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/models.py +0 -0
  156. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
  157. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/base.py +0 -0
  158. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/chat_history.py +0 -0
  159. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
  160. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
  161. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
  162. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +0 -0
  163. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +0 -0
  164. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
  165. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
  166. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
  167. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +0 -0
  168. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +0 -0
  169. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/user_profile.py +0 -0
  170. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/__init__.py +0 -0
  171. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/common/__init__.py +0 -0
  172. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/common/factories.py +0 -0
  173. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/exceptions.py +0 -0
  174. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/job_manager/__init__.py +0 -0
  175. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  176. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/profiling/__init__.py +0 -0
  177. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/profiling/step_timer.py +0 -0
  178. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/resilience/__init__.py +0 -0
  179. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  180. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/__init__.py +0 -0
  181. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
  182. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
  183. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/task_session.py +0 -0
  184. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/exceptions.py +0 -0
  185. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/__init__.py +0 -0
  186. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/exceptions.py +0 -0
  187. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  188. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
  189. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/stream_session.py +0 -0
  190. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  191. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/__init__.py +0 -0
  192. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/base_mixin.py +0 -0
  193. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/cost_mixin.py +0 -0
  194. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/logger_mixin.py +0 -0
  195. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/storage_mixin.py +0 -0
  196. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/__init__.py +0 -0
  197. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/core/__init__.py +0 -0
  198. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/core/job_manager_models.py +0 -0
  199. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/core/redis.py +0 -0
  200. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/core/task_monitor.py +0 -0
  201. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/events/__init__.py +0 -0
  202. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/events/agent_events.py +0 -0
  203. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  204. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
  205. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
  206. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
  207. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/types.py +0 -0
  208. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/ag_ui.py +0 -0
  209. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/base_types.py +0 -0
  210. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/loaded_tools.py +0 -0
  211. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/module.py +0 -0
  212. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/module_types.py +0 -0
  213. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/request_metadata.py +0 -0
  214. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/select_schema.py +0 -0
  215. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/tool_cache.py +0 -0
  216. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/tool_reference.py +0 -0
  217. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/services/cost.py +0 -0
  218. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/services/services.py +0 -0
  219. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/__init__.py +0 -0
  220. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/gateway.py +0 -0
  221. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/log.py +0 -0
  222. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/queue.py +0 -0
  223. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/registry.py +0 -0
  224. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/server/__init__.py +0 -0
  225. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/server/servicer.py +0 -0
  226. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/task_manager.py +0 -0
  227. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  228. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/utils/__init__.py +0 -0
  229. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
  230. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/__init__.py +0 -0
  231. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/archetype_module.py +0 -0
  232. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/tool_module.py +0 -0
  233. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/triggers/__init__.py +0 -0
  234. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/py.typed +0 -0
  235. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/__init__.py +0 -0
  236. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/base_strategy.py +0 -0
  237. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/communication/__init__.py +0 -0
  238. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/cost/__init__.py +0 -0
  239. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  240. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/cost/default_cost.py +0 -0
  241. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/cost/exceptions.py +0 -0
  242. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  243. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/filesystem/exceptions.py +0 -0
  244. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/identity/__init__.py +0 -0
  245. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  246. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/__init__.py +0 -0
  247. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/exceptions.py +0 -0
  248. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/registry_models.py +0 -0
  249. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/secret/__init__.py +0 -0
  250. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/secret/default_secret.py +0 -0
  251. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/secret/exceptions.py +0 -0
  252. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/secret/grpc_secret.py +0 -0
  253. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/secret/secret_strategy.py +0 -0
  254. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/services_models.py +0 -0
  255. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/setup/__init__.py +0 -0
  256. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/setup/exceptions.py +0 -0
  257. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/storage/__init__.py +0 -0
  258. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/storage/exceptions.py +0 -0
  259. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/storage/grpc_storage.py +0 -0
  260. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  261. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/task_manager/__init__.py +0 -0
  262. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/task_manager/exceptions.py +0 -0
  263. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  264. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  265. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/user_profile/__init__.py +0 -0
  266. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/user_profile/exceptions.py +0 -0
  267. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
  268. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  269. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/__init__.py +0 -0
  270. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/conditional_schema.py +0 -0
  271. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/dynamic_schema.py +0 -0
  272. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/exceptions.py +0 -0
  273. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/proto_utils.py +0 -0
  274. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/setup_content_validator.py +0 -0
  275. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  276. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin.egg-info/top_level.txt +0 -0
  277. {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/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.dev4
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.dev4"
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.dev4"
@@ -676,6 +676,26 @@ class AgnoStreamAdapter:
676
676
  self._closed_tool_call_ids.add(tool_call_id)
677
677
 
678
678
  content = agno_event.content
679
+ if tool is not None and tool.tool_call_error:
680
+ # Agno flags a raised tool on the completed event, then sends a tool_call_error
681
+ # that the closed-id check drops — so the failure is surfaced here.
682
+ # TODO(validate): AGUI-TOOL-FAILED-STATUS a raised tool surfaces as ToolCallError, not success
683
+ logger.info(
684
+ "[VALIDATE AGUI-TOOL-FAILED-STATUS] tool %s (id=%s) failed: %s",
685
+ tool.tool_name,
686
+ tool_call_id,
687
+ tool.result,
688
+ )
689
+ return [
690
+ ToolCallErrorEvent(
691
+ event=AgentRunEvent.TOOL_CALL_ERROR,
692
+ tool=tool_info,
693
+ error_message=str(tool.result) if tool.result else None,
694
+ subagent_run_id=self._subagent_of(self._run_key),
695
+ timestamp=timestamp,
696
+ metadata=self._last_metadata,
697
+ )
698
+ ]
679
699
  return [
680
700
  ToolCallCompletedEvent(
681
701
  event=AgentRunEvent.TOOL_CALL_COMPLETED,
@@ -11,6 +11,7 @@ import json
11
11
  import logging
12
12
  from typing import TYPE_CHECKING, Any, ClassVar
13
13
 
14
+ from ag_ui.core.events import Interrupt, RunFinishedInterruptOutcome
14
15
  from pydantic import BaseModel, ConfigDict, Field
15
16
 
16
17
  from digitalkin.community.agno.models import PauseInfo
@@ -268,13 +269,14 @@ class HitlEvents:
268
269
  run_id: str,
269
270
  pending_tool_call_ids: list[str],
270
271
  ) -> None:
271
- """Emit an AG-UI ``RunFinished`` with ``status="awaiting_tool_result"``.
272
+ """Emit an AG-UI ``RunFinished`` with an interrupt outcome.
272
273
 
273
274
  This is the protocol signal telling the front "the run paused on a
274
- client-side tool; execute it and reply with a ``ToolMessage``". It
275
- goes out via ``context.callbacks.send_message`` (bypassing the
276
- standard :class:`~digitalkin.mixins.agui_mixin.AgUiMixin` event
277
- mapping, which has no notion of an "awaiting" status).
275
+ client-side tool; execute it and reply with a ``ToolMessage``". The
276
+ standard ``outcome={type: "interrupt"}`` carries one interrupt per pending
277
+ tool; the legacy ``result.status="awaiting_tool_result"`` is kept for
278
+ existing clients. When an AG-UI run is open, its state first moves the
279
+ tools to ``awaiting_input`` and the run to ``interrupted``.
278
280
 
279
281
  Args:
280
282
  context: Current module context.
@@ -291,11 +293,31 @@ class HitlEvents:
291
293
  AgUiRunFinishedOutput,
292
294
  )
293
295
 
296
+ run = context.agui_run
297
+ tools = run.state["tools"] if run is not None else {}
298
+ interrupts = [
299
+ Interrupt(
300
+ id=tool_call_id,
301
+ reason="tool_call",
302
+ tool_call_id=tool_call_id,
303
+ message=f"Waiting for the result of {tools.get(tool_call_id, {}).get('name') or 'a frontend tool'}",
304
+ )
305
+ for tool_call_id in pending_tool_call_ids
306
+ ]
307
+ if run is not None and run.open:
308
+ run.open = False
309
+ await run.update(
310
+ context,
311
+ *((("tools", tid, "status"), "awaiting_input") for tid in pending_tool_call_ids if tid in tools),
312
+ (("interrupts",), [i.model_dump(mode="json", by_alias=True, exclude_none=True) for i in interrupts]),
313
+ (("run", "status"), "interrupted"),
314
+ )
294
315
  output = AgUiOutput(
295
316
  root=AgUiRunFinishedOutput(
296
317
  event=AgUiRunFinishedEvent(
297
318
  thread_id=thread_id,
298
319
  run_id=run_id,
320
+ outcome=RunFinishedInterruptOutcome(interrupts=interrupts) if interrupts else None,
299
321
  result={
300
322
  "status": _AWAITING_STATUS,
301
323
  "pending_tool_call_ids": pending_tool_call_ids,
@@ -25,6 +25,7 @@ from digitalkin.logger import logger
25
25
  from digitalkin.models.module import ModuleContext
26
26
  from digitalkin.models.module.ag_ui import AgUiCustomEventOutput, AgUiOutput
27
27
  from digitalkin.models.module.tool_cache import ToolDefinition, ToolModuleInfo
28
+ from digitalkin.services.communication.exceptions import ToolCallError
28
29
 
29
30
  # Default timeout for tool calls in seconds
30
31
  DEFAULT_TOOL_TIMEOUT_SECONDS = 300
@@ -265,7 +266,14 @@ class ModuleToolkit(DkToolkit):
265
266
  # callbacks is a dict-driven SimpleNamespace (module_context.py:168);
266
267
  # send_message may legitimately be absent outside a running job.
267
268
  send_message = vars(context.callbacks).get("send_message")
269
+ value = event.get("value")
270
+ url = value.get("url") if isinstance(value, dict) else None
268
271
  if send_message is None:
272
+ logger.warning(
273
+ "Dropped custom event '%s' url=%s: no send_message on the agent context",
274
+ event["name"],
275
+ url,
276
+ )
269
277
  return
270
278
 
271
279
  try:
@@ -275,10 +283,15 @@ class ModuleToolkit(DkToolkit):
275
283
  await send_message(
276
284
  AgUiOutput(
277
285
  root=AgUiCustomEventOutput(
278
- event=AgUiCustomEvent(name=event["name"], value=event.get("value")),
286
+ event=AgUiCustomEvent(name=event["name"], value=value),
279
287
  )
280
288
  )
281
289
  )
290
+ logger.info(
291
+ "Relayed custom event '%s' url=%s to the agent stream",
292
+ event["name"],
293
+ url,
294
+ )
282
295
  except Exception:
283
296
  logger.exception("Failed to relay custom event '%s' to the agent stream", event["name"])
284
297
 
@@ -467,6 +480,10 @@ class ModuleToolkit(DkToolkit):
467
480
  Wraps the SDK module's async generator function into an async function
468
481
  that Agno can consume, with proper error handling and response formatting.
469
482
 
483
+ A failure raises ``ToolCallError`` carrying the same JSON body a success-path caller
484
+ would have read: Agno hands ``str(exc)`` to the model unchanged and flags the call
485
+ ``tool_call_error``, which is what marks the tool failed for the front.
486
+
470
487
  Returns:
471
488
  Async function that calls the SDK tool and returns a JSON result, or a
472
489
  ToolResult when the tool returned images alongside its text output.
@@ -509,14 +526,14 @@ class ModuleToolkit(DkToolkit):
509
526
  duration_ms = round((time.perf_counter() - start_time) * 1000, 2)
510
527
  error_msg = f"Tool '{tool_name}' timed out after {timeout}s"
511
528
  logger.warning("%s task_id=%s", error_msg, task_id)
512
- return handle_failure(tool_name, error_msg, duration_ms)
529
+ raise ToolCallError(handle_failure(tool_name, error_msg, duration_ms))
513
530
 
514
531
  except Exception as e:
515
532
  outcome = "error"
516
533
  duration_ms = round((time.perf_counter() - start_time) * 1000, 2)
517
534
  error_msg = f"Failed to call tool '{tool_name}': {e!s}"
518
535
  logger.warning("%s task_id=%s", error_msg, task_id, exc_info=True)
519
- return handle_failure(tool_name, error_msg, duration_ms)
536
+ raise ToolCallError(handle_failure(tool_name, error_msg, duration_ms))
520
537
 
521
538
  else:
522
539
  call_timer.mark("gen_consume")
@@ -536,7 +553,7 @@ class ModuleToolkit(DkToolkit):
536
553
 
537
554
  outcome = "no_success"
538
555
  error_msg = ModuleToolkit._extract_error_message(error_frame)
539
- return handle_failure(tool_name, error_msg, duration_ms)
556
+ raise ToolCallError(handle_failure(tool_name, error_msg, duration_ms))
540
557
 
541
558
  finally:
542
559
  call_timer.mark("respond")
@@ -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