digitalkin 1.0.4.dev7__tar.gz → 1.0.5.dev2__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 (276) hide show
  1. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/PKG-INFO +2 -2
  2. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/services/filesystem_module.py +6 -7
  3. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/pyproject.toml +45 -45
  4. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/__version__.py +1 -1
  5. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/agno_adapter.py +102 -4
  6. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/hitl.py +16 -1
  7. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/models.py +1 -36
  8. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/module_toolkit.py +76 -70
  9. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/base.py +17 -0
  10. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/chat_history.py +64 -29
  11. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/action.py +15 -47
  12. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/base.py +10 -15
  13. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +1 -1
  14. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +1 -1
  15. digitalkin-1.0.5.dev2/src/digitalkin/community/agno/toolkits/registry/services/action.py +92 -0
  16. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +5 -11
  17. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/job_manager/single_job_manager.py +38 -17
  18. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/profiling/task_profiler.py +3 -3
  19. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/resilience/bulkhead.py +6 -5
  20. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/base_task_manager.py +48 -32
  21. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/local_task_manager.py +4 -6
  22. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/module_runner.py +100 -16
  23. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/redis/__init__.py +1 -3
  24. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/redis/proto_streams.py +2 -2
  25. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/redis/redis_client.py +12 -1
  26. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +5 -6
  27. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/redis/redis_signal.py +22 -15
  28. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/remote_task_manager.py +1 -1
  29. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/task_executor.py +58 -37
  30. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/task_session.py +21 -118
  31. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/_base_server.py +15 -15
  32. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/gateway_servicer.py +116 -80
  33. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/interceptors/permission.py +9 -9
  34. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/interceptors/request_ids.py +1 -1
  35. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/m2m_call_registry.py +2 -2
  36. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/module_server.py +50 -42
  37. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/module_servicer.py +21 -39
  38. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/stream_registry.py +3 -19
  39. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/stream_session.py +3 -5
  40. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +3 -3
  41. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +61 -36
  42. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +1 -1
  43. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +4 -2
  44. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/utils/validators.py +1 -1
  45. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/logger.py +1 -1
  46. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/mixins/agui_mixin.py +7 -6
  47. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/mixins/file_history_mixin.py +3 -4
  48. digitalkin-1.0.5.dev2/src/digitalkin/mixins/filesystem_mixin.py +46 -0
  49. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/core/task_monitor.py +1 -5
  50. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/events/__init__.py +4 -0
  51. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/events/agent_events.py +17 -2
  52. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/grpc_servers/models.py +39 -30
  53. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/__init__.py +2 -6
  54. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/module_context.py +11 -1
  55. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/setup_types.py +1 -1
  56. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/tool_reference.py +2 -2
  57. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/utility.py +7 -0
  58. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/services/__init__.py +0 -4
  59. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/services/registry.py +4 -7
  60. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/services/storage.py +9 -3
  61. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/gateway.py +3 -2
  62. digitalkin-1.0.5.dev2/src/digitalkin/models/settings/grpc_client.py +127 -0
  63. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/module.py +2 -17
  64. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/profiling.py +1 -1
  65. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/redis.py +1 -6
  66. digitalkin-1.0.5.dev2/src/digitalkin/models/settings/resilience.py +31 -0
  67. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/server/channel.py +3 -23
  68. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/server/grpc.py +1 -1
  69. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/server/server.py +2 -6
  70. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/server/servicer.py +1 -2
  71. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/task_manager.py +0 -1
  72. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/utils/channel.py +8 -46
  73. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/modules/_base_module.py +32 -10
  74. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/modules/trigger_handler.py +1 -1
  75. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +2 -2
  76. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +3 -3
  77. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +2 -2
  78. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/communication/communication_strategy.py +1 -1
  79. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/communication/default_communication.py +5 -5
  80. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/communication/exceptions.py +2 -2
  81. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/communication/grpc_communication.py +59 -33
  82. digitalkin-1.0.5.dev2/src/digitalkin/services/filesystem/__init__.py +7 -0
  83. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/filesystem/default_filesystem.py +35 -42
  84. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/filesystem/filesystem_strategy.py +49 -49
  85. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/filesystem/grpc_filesystem.py +40 -20
  86. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/identity/default_identity.py +1 -1
  87. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/registry/default_registry.py +2 -5
  88. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/registry/grpc_registry.py +12 -9
  89. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/registry/registry_strategy.py +2 -2
  90. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/secret/grpc_secret.py +6 -4
  91. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/services_config.py +14 -18
  92. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/setup/default_setup.py +6 -66
  93. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/setup/grpc_setup.py +17 -65
  94. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/setup/setup_strategy.py +6 -43
  95. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/storage/default_storage.py +1 -1
  96. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/storage/grpc_storage.py +12 -20
  97. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/storage/storage_strategy.py +8 -10
  98. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/task_manager/default_task_manager.py +4 -4
  99. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/user_profile/default_user_profile.py +1 -1
  100. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/arg_parser.py +6 -6
  101. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/development_mode_action.py +20 -12
  102. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/llm_ready_schema.py +1 -1
  103. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/package_discover.py +3 -3
  104. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/schema_splitter.py +4 -4
  105. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin.egg-info/PKG-INFO +2 -2
  106. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin.egg-info/SOURCES.txt +1 -12
  107. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin.egg-info/requires.txt +1 -1
  108. digitalkin-1.0.4.dev7/src/digitalkin/community/agno/toolkits/registry/services/action.py +0 -175
  109. digitalkin-1.0.4.dev7/src/digitalkin/core/task_manager/redis/redis_state.py +0 -124
  110. digitalkin-1.0.4.dev7/src/digitalkin/mixins/filesystem_mixin.py +0 -220
  111. digitalkin-1.0.4.dev7/src/digitalkin/models/module/knowledge_files.py +0 -87
  112. digitalkin-1.0.4.dev7/src/digitalkin/models/services/filesystem.py +0 -127
  113. digitalkin-1.0.4.dev7/src/digitalkin/models/settings/certificate.py +0 -90
  114. digitalkin-1.0.4.dev7/src/digitalkin/models/settings/client/__init__.py +0 -1
  115. digitalkin-1.0.4.dev7/src/digitalkin/models/settings/client/channel.py +0 -68
  116. digitalkin-1.0.4.dev7/src/digitalkin/models/settings/client/circuit_breaker.py +0 -19
  117. digitalkin-1.0.4.dev7/src/digitalkin/models/settings/client/client.py +0 -55
  118. digitalkin-1.0.4.dev7/src/digitalkin/models/settings/client/grpc.py +0 -148
  119. digitalkin-1.0.4.dev7/src/digitalkin/models/settings/resilience.py +0 -61
  120. digitalkin-1.0.4.dev7/src/digitalkin/services/filesystem/__init__.py +0 -19
  121. digitalkin-1.0.4.dev7/src/digitalkin/utils/env_manager.py +0 -139
  122. digitalkin-1.0.4.dev7/src/digitalkin/utils/env_template.py +0 -233
  123. digitalkin-1.0.4.dev7/src/digitalkin/utils/json_structure.py +0 -169
  124. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/LICENSE +0 -0
  125. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/README.md +0 -0
  126. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/base_server/__init__.py +0 -0
  127. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/base_server/mock/__init__.py +0 -0
  128. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/base_server/mock/mock_pb2.py +0 -0
  129. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  130. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/base_server/server_async_insecure.py +0 -0
  131. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/base_server/server_async_secure.py +0 -0
  132. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/base_server/server_sync_insecure.py +0 -0
  133. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/base_server/server_sync_secure.py +0 -0
  134. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/bench_module/__init__.py +0 -0
  135. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/bench_module/echo_module.py +0 -0
  136. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/bench_module/models/__init__.py +0 -0
  137. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/bench_module/models/input.py +0 -0
  138. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/bench_module/models/output.py +0 -0
  139. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/bench_module/models/secret.py +0 -0
  140. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/bench_module/models/setup.py +0 -0
  141. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/bench_module/server.py +0 -0
  142. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/bench_module/triggers/__init__.py +0 -0
  143. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/bench_module/triggers/message_trigger.py +0 -0
  144. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/modules/__init__.py +0 -0
  145. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/modules/archetype_with_tools_module.py +0 -0
  146. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/modules/cpu_intensive_module.py +0 -0
  147. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/modules/dynamic_setup_module.py +0 -0
  148. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/modules/minimal_llm_module.py +0 -0
  149. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/modules/text_transform_module.py +0 -0
  150. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  151. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  152. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  153. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  154. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  155. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/monitoring/tests/test_metrics.py +0 -0
  156. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/redis_demo/client.py +0 -0
  157. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/redis_demo/echo_module.py +0 -0
  158. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/redis_demo/models/__init__.py +0 -0
  159. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/redis_demo/models/input.py +0 -0
  160. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/redis_demo/models/output.py +0 -0
  161. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/redis_demo/models/secret.py +0 -0
  162. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/redis_demo/models/setup.py +0 -0
  163. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/redis_demo/server.py +0 -0
  164. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/redis_demo/triggers/__init__.py +0 -0
  165. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/redis_demo/triggers/message_trigger.py +0 -0
  166. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/examples/services/storage_module.py +0 -0
  167. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/setup.cfg +0 -0
  168. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/__init__.py +0 -0
  169. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/__init__.py +0 -0
  170. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/__init__.py +0 -0
  171. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/agui_tools.py +0 -0
  172. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
  173. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
  174. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
  175. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
  176. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +0 -0
  177. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +0 -0
  178. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
  179. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
  180. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
  181. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +0 -0
  182. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +0 -0
  183. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/community/agno/toolkits/user_profile.py +0 -0
  184. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/__init__.py +0 -0
  185. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/common/__init__.py +0 -0
  186. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/common/factories.py +0 -0
  187. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/exceptions.py +0 -0
  188. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/job_manager/__init__.py +0 -0
  189. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  190. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/profiling/__init__.py +0 -0
  191. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/profiling/step_timer.py +0 -0
  192. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/resilience/__init__.py +0 -0
  193. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  194. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/core/task_manager/__init__.py +0 -0
  195. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/exceptions.py +0 -0
  196. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/__init__.py +0 -0
  197. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/exceptions.py +0 -0
  198. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  199. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  200. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/mixins/__init__.py +0 -0
  201. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/mixins/base_mixin.py +0 -0
  202. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/mixins/cost_mixin.py +0 -0
  203. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/mixins/logger_mixin.py +0 -0
  204. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/mixins/storage_mixin.py +0 -0
  205. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/__init__.py +0 -0
  206. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/core/__init__.py +0 -0
  207. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/core/job_manager_models.py +0 -0
  208. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/core/redis.py +0 -0
  209. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  210. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
  211. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
  212. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
  213. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/grpc_servers/types.py +0 -0
  214. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/ag_ui.py +0 -0
  215. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/base_types.py +0 -0
  216. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/loaded_tools.py +0 -0
  217. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/module.py +0 -0
  218. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/module_types.py +0 -0
  219. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/request_metadata.py +0 -0
  220. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/select_schema.py +0 -0
  221. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/module/tool_cache.py +0 -0
  222. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/services/cost.py +0 -0
  223. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/services/services.py +0 -0
  224. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/__init__.py +0 -0
  225. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/log.py +0 -0
  226. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/queue.py +0 -0
  227. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/registry.py +0 -0
  228. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/server/__init__.py +0 -0
  229. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  230. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/utils/__init__.py +0 -0
  231. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
  232. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/modules/__init__.py +0 -0
  233. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/modules/archetype_module.py +0 -0
  234. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/modules/tool_module.py +0 -0
  235. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/modules/triggers/__init__.py +0 -0
  236. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/py.typed +0 -0
  237. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/__init__.py +0 -0
  238. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/base_strategy.py +0 -0
  239. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/communication/__init__.py +0 -0
  240. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/cost/__init__.py +0 -0
  241. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  242. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/cost/default_cost.py +0 -0
  243. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/cost/exceptions.py +0 -0
  244. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  245. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/filesystem/exceptions.py +0 -0
  246. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/identity/__init__.py +0 -0
  247. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  248. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/registry/__init__.py +0 -0
  249. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/registry/exceptions.py +0 -0
  250. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/registry/registry_models.py +0 -0
  251. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/secret/__init__.py +0 -0
  252. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/secret/default_secret.py +0 -0
  253. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/secret/exceptions.py +0 -0
  254. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/secret/secret_strategy.py +0 -0
  255. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/services_models.py +0 -0
  256. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/setup/__init__.py +0 -0
  257. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/setup/exceptions.py +0 -0
  258. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/storage/__init__.py +0 -0
  259. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/storage/exceptions.py +0 -0
  260. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/task_manager/__init__.py +0 -0
  261. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/task_manager/exceptions.py +0 -0
  262. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  263. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  264. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/user_profile/__init__.py +0 -0
  265. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/user_profile/exceptions.py +0 -0
  266. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
  267. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  268. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/__init__.py +0 -0
  269. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/conditional_schema.py +0 -0
  270. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/dynamic_schema.py +0 -0
  271. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/exceptions.py +0 -0
  272. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/proto_utils.py +0 -0
  273. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin/utils/setup_content_validator.py +0 -0
  274. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  275. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/src/digitalkin.egg-info/top_level.txt +0 -0
  276. {digitalkin-1.0.4.dev7 → digitalkin-1.0.5.dev2}/tests/test_exceptions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 1.0.4.dev7
3
+ Version: 1.0.5.dev2
4
4
  Summary: SDK to build kin used in DigitalKin
5
5
  Author-email: "DigitalKin.ai" <contact@digitalkin.ai>
6
6
  License: Attribution-NonCommercial-ShareAlike 4.0 International
@@ -453,7 +453,7 @@ Requires-Python: >=3.10
453
453
  Description-Content-Type: text/markdown
454
454
  License-File: LICENSE
455
455
  Requires-Dist: ag-ui-protocol==0.1.21.dev1787220377
456
- Requires-Dist: agentic-mesh-protocol==1.0.2
456
+ Requires-Dist: agentic-mesh-protocol==1.0.1
457
457
  Requires-Dist: agno<3,>=2.8.0
458
458
  Requires-Dist: anyio>=4.13.0
459
459
  Requires-Dist: grpcio-health-checking==1.82.1
@@ -10,8 +10,7 @@ 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.models.services.filesystem import FileType
14
- from digitalkin.services.filesystem import FileFilter, UploadFileData
13
+ from digitalkin.services.filesystem.filesystem_strategy import FileFilter, UploadFileData
15
14
  from digitalkin.services.services_config import ServicesConfig
16
15
  from digitalkin.services.services_models import ServicesMode
17
16
 
@@ -119,9 +118,9 @@ class ExampleModule(ArchetypeModule[ExampleInput, ExampleOutput, ExampleSetup, E
119
118
  file = UploadFileData(
120
119
  content=b"%s\n%s" % (processed_message.encode(), str(processed_number).encode()),
121
120
  name="example_output.txt",
122
- type=FileType.DOCUMENT,
121
+ file_type="text/plain",
123
122
  content_type="text/plain",
124
- metadata={"sdk_created": True},
123
+ metadata={"example_key": "example_value"},
125
124
  replace_if_exists=True,
126
125
  )
127
126
 
@@ -177,10 +176,10 @@ async def test_module() -> None:
177
176
  # Check the storage
178
177
  if module.status == ModuleStatus.STOPPED:
179
178
  files, _nb_results = await module.filesystem.get_files(
180
- filters=FileFilter(names=["example_output.txt"]),
179
+ filters=FileFilter(name="example_output.txt", context="test-mission-123"),
181
180
  )
182
181
  for file in files:
183
- await module.filesystem.update_file(file.id, type=FileType.OTHER)
182
+ await module.filesystem.update_file(file.id, file_type="updated")
184
183
  # module.filesystem.delete_files(filters=FileFilter(name="example_output.txt", context="test-mission-123"), permanent=True)
185
184
 
186
185
  logger.info("Retrieved file: %s with ID: %s", file.name, file.id)
@@ -189,7 +188,7 @@ async def test_module() -> None:
189
188
  if file_record:
190
189
  logger.info("File ID: %s", file_record.id)
191
190
  logger.info("File name: %s", file_record.name)
192
- logger.info("File type: %s", file_record.type)
191
+ logger.info("File type: %s", file_record.file_type)
193
192
  logger.info("File status: %s", file_record.status)
194
193
  logger.info("File content: %s", file_record.content.decode())
195
194
  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.2",
34
+ "agentic-mesh-protocol==1.0.1",
35
35
  "agno>=2.8.0,<3",
36
36
  "anyio>=4.13.0",
37
37
  "grpcio-health-checking==1.82.1",
@@ -41,7 +41,7 @@
41
41
  "pydantic>=2.12.4",
42
42
  "redis[hiredis]>=7.4.0,<9",
43
43
  ]
44
- version = "1.0.4.dev7"
44
+ version = "1.0.5.dev2"
45
45
 
46
46
  [project.optional-dependencies]
47
47
  agno = [ "agno>=2.6" ]
@@ -208,15 +208,15 @@
208
208
  ]
209
209
 
210
210
  ignore = [
211
- "any-type", # Allow typing.Any — gRPC stubs, callbacks, and dynamic APIs require it
212
- "missing-trailing-comma", # Disable because of formatter incompatibility
213
- "docstring-extraneous-exception", # Allow extraneous-exception in docstring
214
- "unused-import", # Allow unused imports — used for availability checks
215
- "invalid-function-name", # Allow PascalCase methods — gRPC servicer convention
216
- "import-outside-top-level", # Allow lazy imports — needed to break circular dependencies
217
- "bad-dunder-method-name", # Allow __get_pydantic_core_schema__ — Pydantic dunder hook
218
- "hardcoded-password-string", # Hardcoded-password
219
- "suspicious-pickle-import", # Allow pickle import
211
+ "ANN401", # Allow typing.Any — gRPC stubs, callbacks, and dynamic APIs require it
212
+ "COM812", # Disable because of formatter incompatibility
213
+ "DOC502", # Allow extraneous-exception in docstring
214
+ "F401", # Allow unused imports — used for availability checks
215
+ "N802", # Allow PascalCase methods — gRPC servicer convention
216
+ "PLC0415", # Allow lazy imports — needed to break circular dependencies
217
+ "PLW3201", # Allow __get_pydantic_core_schema__ — Pydantic dunder hook
218
+ "S105", # Hardcoded-password
219
+ "S403", # Allow pickle import
220
220
  ]
221
221
 
222
222
  fixable = [ "ALL" ]
@@ -226,40 +226,40 @@
226
226
 
227
227
  [tool.ruff.lint.per-file-ignores]
228
228
  "tests/**/*.py" = [
229
- "missing-type-function-argument",
230
- "missing-type-args",
231
- "missing-type-kwargs",
232
- "missing-return-type-undocumented-public-function",
233
- "any-type",
234
- "unused-function-argument",
235
- "unused-method-argument",
236
- "complex-structure",
237
- "undocumented-public-module",
238
- "undocumented-public-class",
239
- "undocumented-public-method",
240
- "undocumented-public-function",
241
- "undocumented-public-init",
242
- "undocumented-param",
243
- "docstring-missing-returns",
244
- "docstring-missing-exception",
245
- "line-too-long",
246
- "commented-out-code",
247
- "boolean-type-hint-positional-argument",
248
- "boolean-default-value-positional-argument",
249
- "logging-f-string",
250
- "invalid-function-name",
251
- "try-except-in-loop",
252
- "import-private-name",
253
- "too-many-return-statements",
254
- "too-many-branches",
255
- "too-many-locals",
256
- "too-many-statements",
257
- "too-many-nested-blocks",
258
- "magic-value-comparison",
259
- "no-self-use",
260
- "assert",
261
- "private-member-access",
262
- "raise-vanilla-class",
229
+ "ANN001",
230
+ "ANN002",
231
+ "ANN003",
232
+ "ANN201",
233
+ "ANN401",
234
+ "ARG001",
235
+ "ARG002",
236
+ "C901",
237
+ "D100",
238
+ "D101",
239
+ "D102",
240
+ "D103",
241
+ "D107",
242
+ "D417",
243
+ "DOC201",
244
+ "DOC501",
245
+ "E501",
246
+ "ERA001",
247
+ "FBT001",
248
+ "FBT002",
249
+ "G004",
250
+ "N802",
251
+ "PERF203",
252
+ "PLC2701",
253
+ "PLR0911",
254
+ "PLR0912",
255
+ "PLR0914",
256
+ "PLR0915",
257
+ "PLR1702",
258
+ "PLR2004",
259
+ "PLR6301",
260
+ "S101",
261
+ "SLF001",
262
+ "TRY002",
263
263
  ]
264
264
 
265
265
  [tool.ruff.lint.pylint]
@@ -5,4 +5,4 @@ from importlib.metadata import PackageNotFoundError, version
5
5
  try:
6
6
  __version__ = version("digitalkin")
7
7
  except PackageNotFoundError:
8
- __version__ = "1.0.4.dev7"
8
+ __version__ = "1.0.5.dev2"
@@ -7,6 +7,8 @@ import logging
7
7
  import uuid
8
8
  from typing import TYPE_CHECKING, Any, TypeAlias
9
9
 
10
+ from pydantic import ValidationError
11
+
10
12
  if TYPE_CHECKING:
11
13
  from collections.abc import Callable
12
14
 
@@ -54,6 +56,7 @@ if TYPE_CHECKING:
54
56
  from digitalkin.models.events import (
55
57
  AgentRunEvent,
56
58
  BaseAgentRunEvent,
59
+ CustomEvent,
57
60
  ReasoningCompletedEvent,
58
61
  ReasoningContentDeltaEvent,
59
62
  ReasoningStartedEvent,
@@ -62,6 +65,8 @@ from digitalkin.models.events import (
62
65
  RunContentEvent,
63
66
  RunErrorEvent,
64
67
  RunStartedEvent,
68
+ SourceCitation,
69
+ SourceCitationEvent,
65
70
  SubagentErrorEvent,
66
71
  SubagentFinishedEvent,
67
72
  SubagentStartedEvent,
@@ -80,7 +85,9 @@ class AgnoStreamAdapter:
80
85
  """Stateful Agno→DigitalKin event converter.
81
86
 
82
87
  Auto-wraps ``run_content`` deltas in TextMessage/Reasoning lifecycle
83
- events and tracks HITL pause state.
88
+ events and tracks HITL pause state. One adapter serves one stream: its
89
+ dedup state (citations, closed tool calls, completed runs) is reset on each
90
+ top-level ``run_started``, so it must not be shared across concurrent streams.
84
91
  """
85
92
 
86
93
  def __init__(self) -> None:
@@ -94,6 +101,8 @@ class AgnoStreamAdapter:
94
101
  self._reasonings: dict[str, tuple[str, dict[str, Any] | None]] = {}
95
102
 
96
103
  self._closed_tool_call_ids: set[str] = set()
104
+ # Providers repeat the same citations on every delta and again on completion.
105
+ self._cited_urls: set[str] = set()
97
106
 
98
107
  self._active_run_id: str | None = None
99
108
  self._completed_run_ids: set[str] = set()
@@ -206,6 +215,7 @@ class AgnoStreamAdapter:
206
215
  "tool_call_started": self._handle_tool_call_started,
207
216
  "tool_call_completed": self._handle_tool_call_completed,
208
217
  "tool_call_error": self._handle_tool_call_error,
218
+ "custom_event": self._handle_custom_event,
209
219
  }
210
220
  dispatch = {
211
221
  enum_cls[name]: handler
@@ -313,6 +323,17 @@ class AgnoStreamAdapter:
313
323
  self._active_run_id,
314
324
  self._last_metadata,
315
325
  )
326
+ # TODO(validate): ADAPTER-RESET per-run dedup state resets on each new top-level run
327
+ logger.info(
328
+ "[VALIDATE ADAPTER-RESET] run_id=%s clearing cited_urls=%d closed_tool_calls=%d completed_runs=%d",
329
+ run_id,
330
+ len(self._cited_urls),
331
+ len(self._closed_tool_call_ids),
332
+ len(self._completed_run_ids),
333
+ )
334
+ self._cited_urls.clear()
335
+ self._closed_tool_call_ids.clear()
336
+ self._completed_run_ids.clear()
316
337
  self._active_run_id = run_id
317
338
  return [
318
339
  RunStartedEvent(
@@ -337,11 +358,13 @@ class AgnoStreamAdapter:
337
358
  """
338
359
  parent_run_id = getattr(agno_event, "parent_run_id", None)
339
360
  run_id = agno_event.run_id
361
+ citations = self._citations(agno_event, timestamp)
340
362
 
341
363
  if parent_run_id:
342
364
  # Close this member's own text/reasoning bubble, then the matching step. Siblings
343
365
  # still streaming keep theirs open.
344
- events: list[BaseAgentRunEvent] = self._close_content(self._run_key, timestamp)
366
+ events: list[BaseAgentRunEvent] = citations
367
+ events.extend(self._close_content(self._run_key, timestamp))
345
368
  events.extend(self._close_reasoning(self._run_key, timestamp))
346
369
 
347
370
  subagent = self._subagents.pop(run_id, None) if run_id else None
@@ -377,7 +400,8 @@ class AgnoStreamAdapter:
377
400
 
378
401
  # AG-UI refuses RUN_FINISHED while any message, reasoning or step is still open, so
379
402
  # everything still running when the top-level run ends is force-closed here.
380
- events = self._close_all_content(timestamp)
403
+ events = citations
404
+ events.extend(self._close_all_content(timestamp))
381
405
  events.extend(self._close_all_reasoning(timestamp))
382
406
  events.extend(self._close_subagents(timestamp))
383
407
 
@@ -884,6 +908,80 @@ class AgnoStreamAdapter:
884
908
  event for run_key in reversed(list(self._messages)) for event in self._close_content(run_key, timestamp)
885
909
  ]
886
910
 
911
+ def _source_event(self, payload: Any, timestamp: Any) -> SourceCitationEvent | None:
912
+ """Validate one source payload into a ``source_citation`` event.
913
+
914
+ Args:
915
+ payload: ``{url, title?, description?}`` as received.
916
+ timestamp: Event timestamp.
917
+
918
+ Returns:
919
+ The event, or None when the payload is invalid (logged and dropped).
920
+ """
921
+ try:
922
+ citation = SourceCitation.model_validate(payload)
923
+ except ValidationError as exc:
924
+ logger.warning("Dropped source citation %r: %s", payload, exc)
925
+ return None
926
+ return SourceCitationEvent(
927
+ event=AgentRunEvent.CUSTOM,
928
+ name="source_citation",
929
+ value=citation,
930
+ subagent_run_id=self._subagent_of(self._run_key),
931
+ timestamp=timestamp,
932
+ metadata=self._last_metadata,
933
+ )
934
+
935
+ def _citations(
936
+ self, agno_event: AgnoRunContentEvent | AgnoRunCompletedEvent, timestamp: Any
937
+ ) -> list[BaseAgentRunEvent]:
938
+ """Convert the model-native ``citations.urls`` not yet emitted in this run.
939
+
940
+ Returns:
941
+ One SourceCitationEvent per new URL.
942
+ """
943
+ citations = agno_event.citations
944
+ if citations is None or not citations.urls:
945
+ return []
946
+ events: list[BaseAgentRunEvent] = []
947
+ for cite in citations.urls:
948
+ if not cite.url:
949
+ logger.warning("Dropped source citation without url: title=%r", cite.title)
950
+ continue
951
+ if cite.url in self._cited_urls:
952
+ continue
953
+ self._cited_urls.add(cite.url)
954
+ event = self._source_event({"url": cite.url, "title": cite.title}, timestamp)
955
+ if event is not None:
956
+ events.append(event)
957
+ return events
958
+
959
+ def _handle_custom_event(self, agno_event: AgnoRunEvent, timestamp: Any) -> list[BaseAgentRunEvent]:
960
+ """Handle RunEvent.custom_event — agno stores the tool's kwargs as attributes.
961
+
962
+ Returns:
963
+ A SourceCitationEvent for ``source_citation``, a generic CustomEvent otherwise,
964
+ or empty when the event is unnamed or its source is invalid.
965
+ """
966
+ data = agno_event.__dict__
967
+ name = data.get("name")
968
+ if not name:
969
+ logger.debug("Skipping unnamed agno custom event: %r", data)
970
+ return []
971
+ if name == "source_citation":
972
+ event = self._source_event(data.get("value"), timestamp)
973
+ return [event] if event is not None else []
974
+ return [
975
+ CustomEvent(
976
+ event=AgentRunEvent.CUSTOM,
977
+ name=name,
978
+ value=data.get("value"),
979
+ subagent_run_id=self._subagent_of(self._run_key),
980
+ timestamp=timestamp,
981
+ metadata=self._last_metadata,
982
+ )
983
+ ]
984
+
887
985
  def _handle_run_content(self, agno_event: AgnoRunContentEvent, timestamp: Any) -> list[BaseAgentRunEvent]:
888
986
  """Handle RunEvent.run_content — the core state machine.
889
987
 
@@ -892,7 +990,7 @@ class AgnoStreamAdapter:
892
990
  Returns:
893
991
  DigitalKin events for this chunk.
894
992
  """
895
- events: list[BaseAgentRunEvent] = []
993
+ events = self._citations(agno_event, timestamp)
896
994
 
897
995
  reasoning_content = agno_event.reasoning_content
898
996
  content = agno_event.content
@@ -85,11 +85,26 @@ class PausedRunStore:
85
85
  if tid and tid not in seen and tool.external_execution_required and tool.result is None:
86
86
  seen.add(tid)
87
87
  pending.append(tid)
88
+ payload = run_output.to_dict()
89
+ # History messages are re-fetched from the session by continue_run; events are not replayed.
90
+ messages = payload.get("messages") or []
91
+ history = [m for m in messages if m.get("from_history")]
92
+ if history:
93
+ payload["messages"] = [m for m in messages if not m.get("from_history")]
94
+ events = payload.pop("events", None) or []
95
+ # TODO(validate): HITL-TRIM paused runs stored without history messages/events still resume
96
+ logger.info(
97
+ "[VALIDATE HITL-TRIM] thread_id=%s dropped %d history message(s) %s and %d event(s)",
98
+ thread_id,
99
+ len(history),
100
+ [(m.get("id"), m.get("role")) for m in history],
101
+ len(events),
102
+ )
88
103
  record = PausedRunRecord(
89
104
  thread_id=thread_id,
90
105
  run_id=run_output.run_id or "",
91
106
  pending_tool_call_ids=pending,
92
- payload=run_output.to_dict(),
107
+ payload=payload,
93
108
  )
94
109
  await self._storage.upsert(
95
110
  collection=self.COLLECTION,
@@ -67,8 +67,6 @@ class ToolCallMetadata(BaseModel):
67
67
  duration_ms: Execution time in milliseconds.
68
68
  cost_tracked: Whether cost metadata is available from the tool.
69
69
  error: Error message if the call failed, None otherwise.
70
- input_kwargs: The kwargs passed to the tool (for debugging).
71
- output_summary: Brief summary of the output (truncated for logs).
72
70
  tool_metadata: Metadata returned by the tool itself (cost, API calls, etc.).
73
71
  """
74
72
 
@@ -77,14 +75,6 @@ class ToolCallMetadata(BaseModel):
77
75
  duration_ms: float = Field(..., description="Execution time in milliseconds")
78
76
  cost_tracked: bool = Field(default=False, description="Whether cost metadata is available from tool")
79
77
  error: str | None = Field(default=None, description="Error message if failed")
80
- input_kwargs: dict[str, Any] | None = Field(
81
- default=None,
82
- description="Input kwargs passed to the tool for debugging",
83
- )
84
- output_summary: str | None = Field(
85
- default=None,
86
- description="Brief summary of the output (truncated)",
87
- )
88
78
  tool_metadata: ToolOutputMetadata | None = Field(
89
79
  default=None,
90
80
  description="Metadata returned by the tool module (cost, API calls, etc.)",
@@ -94,7 +84,7 @@ class ToolCallMetadata(BaseModel):
94
84
  """Convert metadata to dict for successful responses.
95
85
 
96
86
  Returns:
97
- Dictionary with success-relevant fields (error excluded).
87
+ Dictionary with success-relevant fields; error is excluded.
98
88
  """
99
89
  return self.model_dump(exclude={"error"})
100
90
 
@@ -106,31 +96,6 @@ class ToolCallMetadata(BaseModel):
106
96
  """
107
97
  return self.model_dump(include={"module_id", "success", "duration_ms", "error"})
108
98
 
109
- def to_log_dict(self) -> dict[str, Any]:
110
- """Convert metadata to dict for logging.
111
-
112
- Returns:
113
- Dictionary suitable for log extra data, large kwargs truncated.
114
- """
115
- data: dict[str, Any] = {
116
- "module_id": self.module_id,
117
- "success": self.success,
118
- "duration_ms": self.duration_ms,
119
- "cost_tracked": self.cost_tracked,
120
- }
121
- if self.error:
122
- data["error"] = self.error
123
- if self.input_kwargs:
124
- max_len = 100
125
- data["input_kwargs"] = {
126
- k: (str(v)[:max_len] + "..." if len(str(v)) > max_len else v) for k, v in self.input_kwargs.items()
127
- }
128
- if self.output_summary:
129
- data["output_summary"] = self.output_summary
130
- if self.tool_metadata:
131
- data["tool_metadata"] = self.tool_metadata.model_dump(exclude_none=True)
132
- return data
133
-
134
99
  @staticmethod
135
100
  def extract_tool_metadata(output: dict[str, Any]) -> "ToolOutputMetadata | None":
136
101
  """Extract tool metadata from a tool's output if present.