digitalkin 1.0.0.dev6__tar.gz → 1.0.0.dev8__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 (249) hide show
  1. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/PKG-INFO +2 -2
  2. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/pyproject.toml +12 -12
  3. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/__init__.py +8 -10
  4. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/__version__.py +1 -1
  5. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/community/agno/__init__.py +1 -1
  6. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/community/agno/agno_adapter.py +20 -104
  7. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/community/agno/hitl.py +65 -303
  8. digitalkin-1.0.0.dev8/src/digitalkin/community/agno/models.py +28 -0
  9. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/common/factories.py +6 -5
  10. digitalkin-1.0.0.dev8/src/digitalkin/core/exceptions.py +16 -0
  11. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/job_manager/base_job_manager.py +3 -2
  12. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/job_manager/single_job_manager.py +50 -80
  13. digitalkin-1.0.0.dev8/src/digitalkin/core/profiling/__init__.py +6 -0
  14. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/profiling/step_timer.py +22 -1
  15. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/profiling/task_profiler.py +26 -71
  16. digitalkin-1.0.0.dev8/src/digitalkin/core/resilience/__init__.py +12 -0
  17. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/resilience/bulkhead.py +15 -21
  18. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/resilience/task_supervisor.py +4 -2
  19. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/base_task_manager.py +43 -80
  20. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/local_task_manager.py +3 -5
  21. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/module_runner.py +70 -50
  22. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/redis/__init__.py +2 -1
  23. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/redis/instrumented.py +0 -16
  24. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/redis/proto_streams.py +48 -92
  25. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/redis/redis_checkpoint.py +6 -10
  26. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/redis/redis_client.py +15 -66
  27. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +7 -21
  28. digitalkin-1.0.0.dev8/src/digitalkin/core/task_manager/redis/redis_signal.py +379 -0
  29. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/redis/redis_state.py +6 -11
  30. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/redis/redis_streams.py +24 -53
  31. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/task_executor.py +36 -21
  32. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/task_session.py +58 -109
  33. digitalkin-1.0.0.dev8/src/digitalkin/exceptions.py +5 -0
  34. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/_base_server.py +84 -183
  35. {digitalkin-1.0.0.dev6/src/digitalkin/grpc_servers/utils → digitalkin-1.0.0.dev8/src/digitalkin/grpc_servers}/exceptions.py +10 -6
  36. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/gateway_servicer.py +259 -272
  37. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/interceptors/circuit_breaker_interceptor.py +6 -3
  38. digitalkin-1.0.0.dev8/src/digitalkin/grpc_servers/m2m_call_registry.py +223 -0
  39. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/module_server.py +14 -14
  40. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/module_servicer.py +74 -58
  41. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/stream_registry.py +11 -19
  42. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/stream_session.py +1 -1
  43. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +9 -23
  44. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +9 -46
  45. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +1 -1
  46. digitalkin-1.0.0.dev8/src/digitalkin/grpc_servers/utils/validators.py +84 -0
  47. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/logger.py +8 -20
  48. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/mixins/file_history_mixin.py +3 -5
  49. digitalkin-1.0.0.dev8/src/digitalkin/models/core/redis.py +11 -0
  50. digitalkin-1.0.0.dev8/src/digitalkin/models/grpc_servers/circuit_breaker.py +11 -0
  51. digitalkin-1.0.0.dev8/src/digitalkin/models/grpc_servers/m2m.py +22 -0
  52. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/grpc_servers/models.py +25 -29
  53. {digitalkin-1.0.0.dev6/src/digitalkin → digitalkin-1.0.0.dev8/src/digitalkin/models}/grpc_servers/stream_error_codes.py +2 -0
  54. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/__init__.py +1 -8
  55. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/ag_ui.py +0 -35
  56. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/module_context.py +6 -4
  57. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/setup_types.py +21 -7
  58. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/tool_reference.py +13 -6
  59. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/utility.py +0 -18
  60. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/services/cost.py +11 -0
  61. digitalkin-1.0.0.dev8/src/digitalkin/models/services/services.py +10 -0
  62. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/services/storage.py +9 -0
  63. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/settings/consumer.py +20 -4
  64. digitalkin-1.0.0.dev8/src/digitalkin/models/settings/gateway.py +171 -0
  65. digitalkin-1.0.0.dev8/src/digitalkin/models/settings/grpc_client.py +127 -0
  66. digitalkin-1.0.0.dev8/src/digitalkin/models/settings/log.py +38 -0
  67. digitalkin-1.0.0.dev8/src/digitalkin/models/settings/module.py +31 -0
  68. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/settings/profiling.py +25 -0
  69. digitalkin-1.0.0.dev8/src/digitalkin/models/settings/queue.py +26 -0
  70. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/settings/redis.py +31 -6
  71. digitalkin-1.0.0.dev8/src/digitalkin/models/settings/resilience.py +31 -0
  72. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/settings/server/channel.py +13 -0
  73. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/settings/server/grpc.py +13 -25
  74. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/settings/server/server.py +15 -0
  75. digitalkin-1.0.0.dev8/src/digitalkin/models/settings/server/servicer.py +27 -0
  76. digitalkin-1.0.0.dev8/src/digitalkin/models/settings/task_manager.py +57 -0
  77. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/settings/utils/channel.py +1 -1
  78. digitalkin-1.0.0.dev8/src/digitalkin/models/utils/__init__.py +1 -0
  79. digitalkin-1.0.0.dev8/src/digitalkin/models/utils/dynamic_schema.py +54 -0
  80. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/modules/_base_module.py +25 -36
  81. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/modules/archetype_module.py +4 -0
  82. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/communication/__init__.py +8 -14
  83. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/communication/communication_strategy.py +15 -15
  84. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/communication/default_communication.py +20 -21
  85. digitalkin-1.0.0.dev8/src/digitalkin/services/communication/exceptions.py +13 -0
  86. digitalkin-1.0.0.dev8/src/digitalkin/services/communication/grpc_communication.py +510 -0
  87. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/cost/__init__.py +2 -1
  88. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/cost/cost_strategy.py +1 -17
  89. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/cost/default_cost.py +2 -3
  90. digitalkin-1.0.0.dev8/src/digitalkin/services/cost/exceptions.py +5 -0
  91. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/cost/grpc_cost.py +2 -3
  92. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/filesystem/default_filesystem.py +1 -8
  93. digitalkin-1.0.0.dev8/src/digitalkin/services/filesystem/exceptions.py +5 -0
  94. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -4
  95. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/filesystem/grpc_filesystem.py +1 -1
  96. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/registry/grpc_registry.py +1 -1
  97. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/services_config.py +3 -8
  98. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/services_models.py +1 -8
  99. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/setup/default_setup.py +2 -1
  100. digitalkin-1.0.0.dev8/src/digitalkin/services/setup/exceptions.py +5 -0
  101. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/setup/grpc_setup.py +3 -3
  102. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/setup/setup_strategy.py +0 -4
  103. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/storage/default_storage.py +1 -1
  104. digitalkin-1.0.0.dev8/src/digitalkin/services/storage/exceptions.py +5 -0
  105. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/storage/grpc_storage.py +2 -2
  106. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/storage/storage_strategy.py +2 -14
  107. digitalkin-1.0.0.dev8/src/digitalkin/services/task_manager/default_task_manager.py +46 -0
  108. digitalkin-1.0.0.dev8/src/digitalkin/services/task_manager/exceptions.py +5 -0
  109. digitalkin-1.0.0.dev8/src/digitalkin/services/task_manager/redis_task_manager.py +65 -0
  110. digitalkin-1.0.0.dev8/src/digitalkin/services/task_manager/task_manager_strategy.py +30 -0
  111. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/user_profile/__init__.py +2 -1
  112. digitalkin-1.0.0.dev8/src/digitalkin/services/user_profile/exceptions.py +5 -0
  113. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/user_profile/grpc_user_profile.py +2 -1
  114. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -4
  115. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/utils/__init__.py +1 -1
  116. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/utils/conditional_schema.py +3 -51
  117. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/utils/development_mode_action.py +1 -1
  118. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/utils/dynamic_schema.py +4 -60
  119. digitalkin-1.0.0.dev8/src/digitalkin/utils/exceptions.py +9 -0
  120. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/utils/package_discover.py +16 -23
  121. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin.egg-info/PKG-INFO +2 -2
  122. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin.egg-info/SOURCES.txt +28 -8
  123. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin.egg-info/requires.txt +1 -1
  124. digitalkin-1.0.0.dev6/src/digitalkin/core/profiling/__init__.py +0 -5
  125. digitalkin-1.0.0.dev6/src/digitalkin/core/resilience/__init__.py +0 -22
  126. digitalkin-1.0.0.dev6/src/digitalkin/core/resilience/graceful_shutdown.py +0 -206
  127. digitalkin-1.0.0.dev6/src/digitalkin/core/resilience/session_reaper.py +0 -117
  128. digitalkin-1.0.0.dev6/src/digitalkin/core/resilience/watchdog.py +0 -166
  129. digitalkin-1.0.0.dev6/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -430
  130. digitalkin-1.0.0.dev6/src/digitalkin/core/task_manager/task_wrapper.py +0 -97
  131. digitalkin-1.0.0.dev6/src/digitalkin/grpc_servers/gateway_constants.py +0 -145
  132. digitalkin-1.0.0.dev6/src/digitalkin/models/settings/gateway.py +0 -70
  133. digitalkin-1.0.0.dev6/src/digitalkin/services/communication/gateway_consumer.py +0 -416
  134. digitalkin-1.0.0.dev6/src/digitalkin/services/communication/grpc_communication.py +0 -306
  135. digitalkin-1.0.0.dev6/src/digitalkin/services/task_manager/default_task_manager.py +0 -89
  136. digitalkin-1.0.0.dev6/src/digitalkin/services/task_manager/redis_task_manager.py +0 -94
  137. digitalkin-1.0.0.dev6/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -52
  138. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/LICENSE +0 -0
  139. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/README.md +0 -0
  140. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/base_server/__init__.py +0 -0
  141. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/base_server/mock/__init__.py +0 -0
  142. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/base_server/mock/mock_pb2.py +0 -0
  143. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  144. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/base_server/server_async_insecure.py +0 -0
  145. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/base_server/server_async_secure.py +0 -0
  146. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/base_server/server_sync_insecure.py +0 -0
  147. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/base_server/server_sync_secure.py +0 -0
  148. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/bench_module/__init__.py +0 -0
  149. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/bench_module/echo_module.py +0 -0
  150. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/bench_module/models/__init__.py +0 -0
  151. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/bench_module/models/input.py +0 -0
  152. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/bench_module/models/output.py +0 -0
  153. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/bench_module/models/secret.py +0 -0
  154. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/bench_module/models/setup.py +0 -0
  155. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/bench_module/server.py +0 -0
  156. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/bench_module/triggers/__init__.py +0 -0
  157. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/bench_module/triggers/message_trigger.py +0 -0
  158. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/modules/__init__.py +0 -0
  159. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/modules/archetype_with_tools_module.py +0 -0
  160. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/modules/cpu_intensive_module.py +0 -0
  161. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/modules/dynamic_setup_module.py +0 -0
  162. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/modules/minimal_llm_module.py +0 -0
  163. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/modules/text_transform_module.py +0 -0
  164. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  165. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  166. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  167. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  168. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  169. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/monitoring/tests/test_metrics.py +0 -0
  170. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/redis_demo/client.py +0 -0
  171. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/redis_demo/echo_module.py +0 -0
  172. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/redis_demo/models/__init__.py +0 -0
  173. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/redis_demo/models/input.py +0 -0
  174. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/redis_demo/models/output.py +0 -0
  175. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/redis_demo/models/secret.py +0 -0
  176. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/redis_demo/models/setup.py +0 -0
  177. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/redis_demo/server.py +0 -0
  178. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/redis_demo/triggers/__init__.py +0 -0
  179. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/redis_demo/triggers/message_trigger.py +0 -0
  180. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/services/filesystem_module.py +0 -0
  181. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/examples/services/storage_module.py +0 -0
  182. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/setup.cfg +0 -0
  183. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/community/__init__.py +0 -0
  184. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/community/agno/agui_tools.py +0 -0
  185. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/__init__.py +0 -0
  186. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/common/__init__.py +0 -0
  187. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/job_manager/__init__.py +0 -0
  188. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/__init__.py +0 -0
  189. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/redis/shadow.py +0 -0
  190. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  191. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/__init__.py +0 -0
  192. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  193. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  194. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
  195. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/mixins/__init__.py +0 -0
  196. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/mixins/agui_mixin.py +0 -0
  197. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/mixins/base_mixin.py +0 -0
  198. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/mixins/cost_mixin.py +0 -0
  199. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  200. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/mixins/logger_mixin.py +0 -0
  201. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/mixins/storage_mixin.py +0 -0
  202. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/__init__.py +0 -0
  203. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/core/__init__.py +0 -0
  204. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/core/job_manager_models.py +0 -0
  205. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/core/task_monitor.py +0 -0
  206. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/events/__init__.py +0 -0
  207. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/events/agent_events.py +0 -0
  208. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  209. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/grpc_servers/types.py +0 -0
  210. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/base_types.py +0 -0
  211. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/module.py +0 -0
  212. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/module_types.py +0 -0
  213. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/request_metadata.py +0 -0
  214. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/select_schema.py +0 -0
  215. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/module/tool_cache.py +0 -0
  216. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/services/__init__.py +0 -0
  217. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/services/registry.py +0 -0
  218. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/settings/__init__.py +0 -0
  219. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/settings/server/__init__.py +0 -0
  220. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  221. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/modules/__init__.py +0 -0
  222. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/modules/tool_module.py +0 -0
  223. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/modules/trigger_handler.py +0 -0
  224. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/modules/triggers/__init__.py +0 -0
  225. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
  226. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
  227. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
  228. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/py.typed +0 -0
  229. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/__init__.py +0 -0
  230. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/base_strategy.py +0 -0
  231. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/filesystem/__init__.py +0 -0
  232. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/identity/__init__.py +0 -0
  233. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/identity/default_identity.py +0 -0
  234. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  235. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/registry/__init__.py +0 -0
  236. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/registry/default_registry.py +0 -0
  237. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/registry/exceptions.py +0 -0
  238. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/registry/registry_models.py +0 -0
  239. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/registry/registry_strategy.py +0 -0
  240. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/setup/__init__.py +0 -0
  241. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/storage/__init__.py +0 -0
  242. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/task_manager/__init__.py +0 -0
  243. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  244. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/utils/arg_parser.py +0 -0
  245. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  246. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/utils/proto_utils.py +0 -0
  247. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin/utils/schema_splitter.py +0 -0
  248. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  249. {digitalkin-1.0.0.dev6 → digitalkin-1.0.0.dev8}/src/digitalkin.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 1.0.0.dev6
3
+ Version: 1.0.0.dev8
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
@@ -459,7 +459,7 @@ Requires-Dist: grpcio-health-checking==1.80.0
459
459
  Requires-Dist: grpcio-reflection==1.80.0
460
460
  Requires-Dist: grpcio-status==1.80.0
461
461
  Requires-Dist: pydantic>=2.12.4
462
- Requires-Dist: pydantic-settings>=2.14.0
462
+ Requires-Dist: pydantic-settings>=2.14.1
463
463
  Requires-Dist: redis[hiredis]<8,>=7.4.0
464
464
  Provides-Extra: performance
465
465
  Requires-Dist: uvloop>=0.21; extra == "performance"
@@ -34,10 +34,10 @@
34
34
  "grpcio-reflection==1.80.0",
35
35
  "grpcio-status==1.80.0",
36
36
  "pydantic>=2.12.4",
37
- "pydantic-settings>=2.14.0",
37
+ "pydantic-settings>=2.14.1",
38
38
  "redis[hiredis]>=7.4.0,<8",
39
39
  ]
40
- version = "1.0.0.dev6"
40
+ version = "1.0.0.dev8"
41
41
 
42
42
  [project.optional-dependencies]
43
43
  performance = [ "uvloop>=0.21" ]
@@ -60,16 +60,16 @@
60
60
  "build>=1.5.0",
61
61
  "bump-my-version>=1.3.0",
62
62
  "cryptography>=48.0.0",
63
- "mypy>=2.0.0",
63
+ "mypy>=2.1.0",
64
64
  "pre-commit>=4.6.0",
65
65
  "pyright>=1.1.409",
66
- "ruff>=0.15.12",
66
+ "ruff>=0.15.13",
67
67
  "twine>=6.2.0",
68
- "types-grpcio-health-checking>=1.0.0.20260408",
69
- "types-grpcio-reflection>=1.0.0.20260408",
70
- "types-grpcio>=1.0.0.20260408",
71
- "types-protobuf>=7.34.1.20260503",
72
- "typos>=1.46.0",
68
+ "types-grpcio-health-checking>=1.0.0.20260518",
69
+ "types-grpcio-reflection>=1.0.0.20260508",
70
+ "types-grpcio>=1.0.0.20260518",
71
+ "types-protobuf>=7.34.1.20260518",
72
+ "typos>=1.46.2",
73
73
  ]
74
74
  docs = [
75
75
  "griffe-inherited-docstrings>=1.1.3",
@@ -80,9 +80,9 @@
80
80
  "mkdocs-awesome-pages-plugin>=2.10.1",
81
81
  "mkdocs-coverage>=2.0.0",
82
82
  "mkdocs-git-committers-plugin-2>=2.5.0",
83
- "mkdocs-git-revision-date-localized-plugin>=1.5.1",
83
+ "mkdocs-git-revision-date-localized-plugin>=1.5.2",
84
84
  "mkdocs-glightbox>=0.5.2",
85
- "mkdocs-include-markdown-plugin>=7.2.2",
85
+ "mkdocs-include-markdown-plugin>=7.3.0",
86
86
  "mkdocs-literate-nav>=0.6.3",
87
87
  "mkdocs-llmstxt>=0.5.0",
88
88
  "mkdocs-material[imaging]>=9.7.6",
@@ -100,7 +100,7 @@
100
100
  "freezegun>=1.5.5",
101
101
  "grpcio-testing>=1.80.0",
102
102
  "hdrhistogram>=0.10.3",
103
- "hypothesis>=6.152.4",
103
+ "hypothesis>=6.152.8",
104
104
  "objgraph>=3.6",
105
105
  "psutil>=7.2.2",
106
106
  "pytest-asyncio>=1.3.0",
@@ -10,24 +10,22 @@ from digitalkin.modules.archetype_module import ArchetypeModule
10
10
  from digitalkin.modules.tool_module import ToolModule
11
11
  from digitalkin.modules.trigger_handler import TriggerHandler
12
12
  from digitalkin.services.communication import (
13
- ConsumerConfig,
14
- GatewayConsumer,
15
- GatewayConsumerError,
16
- StartStreamRejected,
17
- StartStreamRpcError,
13
+ GrpcCommunication,
14
+ M2MAtCapacityError,
15
+ M2MCallTimeout,
16
+ M2MTargetUnavailable,
18
17
  )
19
18
  from digitalkin.services.services_config import ServicesConfig
20
19
 
21
20
  __all__ = [
22
21
  "ArchetypeModule",
23
- "ConsumerConfig",
24
- "GatewayConsumer",
25
- "GatewayConsumerError",
22
+ "GrpcCommunication",
23
+ "M2MAtCapacityError",
24
+ "M2MCallTimeout",
25
+ "M2MTargetUnavailable",
26
26
  "ModuleContext",
27
27
  "ModuleStatus",
28
28
  "ServicesConfig",
29
- "StartStreamRejected",
30
- "StartStreamRpcError",
31
29
  "ToolModule",
32
30
  "TriggerHandler",
33
31
  "__version__",
@@ -5,4 +5,4 @@ from importlib.metadata import PackageNotFoundError, version
5
5
  try:
6
6
  __version__ = version("digitalkin")
7
7
  except PackageNotFoundError:
8
- __version__ = "1.0.0.dev6"
8
+ __version__ = "1.0.0.dev8"
@@ -24,10 +24,10 @@ from digitalkin.community.agno.hitl import (
24
24
  AgnoHitlRunner,
25
25
  PausedRunRecord,
26
26
  PausedRunStore,
27
- PauseInfo,
28
27
  emit_awaiting_tool_result,
29
28
  emit_messages_snapshot,
30
29
  )
30
+ from digitalkin.community.agno.models import PauseInfo
31
31
 
32
32
  __all__ = [
33
33
  "HITL_STORAGE_CONFIG",
@@ -1,12 +1,4 @@
1
- """Adapter to convert Agno events to DigitalKin framework-agnostic events.
2
-
3
- This adapter bridges Agno-specific events to the DigitalKin event model,
4
- allowing the core DigitalKin SDK to remain independent of Agno.
5
-
6
- The adapter owns ALL state management: tracking reasoning/content lifecycle,
7
- generating message_id and reasoning_id on each phase start, and emitting
8
- proper start/completed events for text message and reasoning sequences.
9
- """
1
+ """Convert Agno streaming events into framework-agnostic DigitalKin events."""
10
2
 
11
3
  from __future__ import annotations
12
4
 
@@ -40,20 +32,10 @@ logger = logging.getLogger(__name__)
40
32
 
41
33
 
42
34
  class AgnoStreamAdapter:
43
- """Stateful converter: Agno streaming events -> DigitalKin events.
44
-
45
- Tracks reasoning and content state so that events arriving on
46
- ``RunEvent.run_content`` are automatically wrapped in proper
47
- lifecycle events (TextMessageStarted/Completed, ReasoningStarted/Completed).
35
+ """Stateful Agno→DigitalKin event converter.
48
36
 
49
- Usage::
50
-
51
- adapter = AgnoStreamAdapter()
52
- async for raw_event in agent.arun(..., stream=True, stream_events=True):
53
- for event in adapter.to_digitalkin_events(raw_event):
54
- await send(event)
55
- for event in adapter.flush():
56
- await send(event)
37
+ Auto-wraps ``run_content`` deltas in TextMessage/Reasoning lifecycle
38
+ events and tracks HITL pause state.
57
39
  """
58
40
 
59
41
  def __init__(self) -> None:
@@ -69,9 +51,6 @@ class AgnoStreamAdapter:
69
51
  self._active_run_id: str | None = None
70
52
  self._completed_run_ids: set[str] = set()
71
53
 
72
- # HITL pause state — populated when a RunPausedEvent is seen
73
- # (tools with external_execution=True). Callers can inspect these
74
- # after streaming to decide whether to persist and resume later.
75
54
  self._is_paused: bool = False
76
55
  self._paused_tool_executions: list[Any] = []
77
56
  self._paused_requirements: list[Any] = []
@@ -94,20 +73,20 @@ class AgnoStreamAdapter:
94
73
  return list(self._paused_requirements)
95
74
 
96
75
  def to_digitalkin_events(self, agno_event: Any) -> list[BaseAgentRunEvent]:
97
- """Convert one Agno event into one or more DigitalKin events.
76
+ """Convert one Agno event into DigitalKin events.
98
77
 
99
78
  Args:
100
79
  agno_event: Event from Agno's streaming API.
101
80
 
102
81
  Returns:
103
- List of corresponding DigitalKin events (may be empty).
82
+ List of DigitalKin events (may be empty).
104
83
 
105
84
  Raises:
106
85
  ImportError: If the optional 'agno' dependency is not installed.
107
86
  """
108
87
  if self._dispatch is None:
109
88
  try:
110
- from agno.run.agent import RunEvent # pylint: disable=C0415 # pyright: ignore[reportMissingImports]
89
+ from agno.run.agent import RunEvent # pyright: ignore[reportMissingImports]
111
90
  except ImportError as exc:
112
91
  message = "The 'agno' package is required to use AgnoStreamAdapter. Install it with: pip install agno"
113
92
  raise ImportError(message) from exc
@@ -137,8 +116,6 @@ class AgnoStreamAdapter:
137
116
 
138
117
  return handler(agno_event, getattr(agno_event, "timestamp", None))
139
118
 
140
- # ── Run Lifecycle Handlers ───────────────────────────────────────────
141
-
142
119
  def _handle_run_started(self, agno_event: Any, timestamp: Any) -> list[BaseAgentRunEvent]:
143
120
  """Handle RunEvent.run_started.
144
121
 
@@ -219,8 +196,6 @@ class AgnoStreamAdapter:
219
196
  )
220
197
  ]
221
198
 
222
- # ── Reasoning Handlers (native Agno reasoning models) ───────────────
223
-
224
199
  def _handle_reasoning_started(self, agno_event: Any, timestamp: Any) -> list[BaseAgentRunEvent]:
225
200
  """Handle RunEvent.reasoning_started.
226
201
 
@@ -263,25 +238,11 @@ class AgnoStreamAdapter:
263
238
  ]
264
239
 
265
240
  def _handle_reasoning_step(self, agno_event: Any, timestamp: Any) -> list[BaseAgentRunEvent]:
266
- """Handle ``RunEvent.reasoning_step`` emitted by Agno's ``ReasoningTools``.
267
-
268
- Unlike the native reasoning events (``reasoning_started`` /
269
- ``reasoning_content_delta`` / ``reasoning_completed``), a
270
- ``reasoning_step`` may arrive without a preceding
271
- ``reasoning_started``. This happens when the LLM calls tool-based
272
- reasoning (``think`` / ``analyze`` from ``ReasoningTools``) rather
273
- than using the model's built-in extended thinking.
274
-
275
- To comply with the AG-UI protocol — which requires every
276
- ``REASONING_MESSAGE_CONTENT`` to be wrapped in a
277
- ``REASONING_START`` … ``REASONING_END`` lifecycle — we auto-open
278
- a reasoning sequence here if none is active. The sequence is
279
- auto-closed by the next non-reasoning event (``_handle_run_content``,
280
- ``_handle_tool_call_started``, etc.) or by ``flush()``.
241
+ """Handle ``reasoning_step``; auto-opens a reasoning sequence if needed.
281
242
 
282
243
  Returns:
283
- List of events: optionally a ``ReasoningStartedEvent`` (if
284
- auto-opened), followed by the ``ReasoningStepEvent``.
244
+ Optionally a ``ReasoningStartedEvent`` followed by the
245
+ ``ReasoningStepEvent``.
285
246
  """
286
247
  events: list[BaseAgentRunEvent] = []
287
248
 
@@ -289,11 +250,9 @@ class AgnoStreamAdapter:
289
250
  if not content:
290
251
  return events
291
252
 
292
- # Close active text message if transitioning to reasoning
293
253
  if self._content_active:
294
254
  events.extend(self._close_content(timestamp))
295
255
 
296
- # Auto-open reasoning lifecycle if not already active
297
256
  if not self._reasoning_active:
298
257
  self._current_reasoning_id = str(uuid.uuid4())
299
258
  self._reasoning_active = True
@@ -328,8 +287,6 @@ class AgnoStreamAdapter:
328
287
  logger.debug("Reasoning completed")
329
288
  return self._close_reasoning(timestamp)
330
289
 
331
- # ── Tool Call Handlers ──────────────────────────────────────────────
332
-
333
290
  def _handle_tool_call_started(self, agno_event: Any, timestamp: Any) -> list[BaseAgentRunEvent]:
334
291
  """Handle RunEvent.tool_call_started.
335
292
 
@@ -395,33 +352,14 @@ class AgnoStreamAdapter:
395
352
  ]
396
353
 
397
354
  def _handle_run_paused(self, agno_event: Any, timestamp: Any) -> list[BaseAgentRunEvent]:
398
- """Handle ``RunEvent.run_paused`` HITL pause on external tool execution.
399
-
400
- Agno does NOT emit ``tool_call_started`` / ``tool_call_completed`` for
401
- tools declared with ``external_execution=True`` (see
402
- ``agno/models/base.py`` where the emission is short-circuited). The
403
- front therefore never sees the corresponding AG-UI ``ToolCallStart``
404
- / ``ToolCallArgs`` / ``ToolCallEnd`` events unless we synthesize them.
405
-
406
- This handler:
407
-
408
- 1. Closes any active reasoning / content sequence.
409
- 2. Iterates ``RunPausedEvent.tools`` and emits one pair of
410
- ``ToolCallStartedEvent`` + ``ToolCallCompletedEvent`` per tool.
411
- The ``ToolCallCompletedEvent`` carries ``content=None`` and
412
- ``tool.result=None`` so the downstream AG-UI bridge emits
413
- ``ToolCallEnd`` *without* a ``ToolCallResult`` (guarded by the
414
- ``if result_content:`` check in ``AgUiMixin``).
415
- 3. Records pause state on the adapter (``is_paused``,
416
- ``paused_tool_executions``, ``paused_requirements``) so callers
417
- can detect the pause after streaming and persist the run for
418
- later resumption.
355
+ """Handle ``run_paused``; synthesize tool-call events for external tools.
356
+
357
+ Agno suppresses tool_call_started/completed for tools with
358
+ ``external_execution=True``; we re-emit them so the front sees
359
+ the call.
419
360
 
420
361
  Returns:
421
- Synthesized tool-call events for the paused tools. The caller
422
- is responsible for subsequently emitting the AG-UI
423
- ``RunFinished`` with ``result.status = "awaiting_tool_result"``
424
- — this adapter stays protocol-agnostic.
362
+ Synthesized tool-call events for the paused external tools.
425
363
  """
426
364
  events: list[BaseAgentRunEvent] = []
427
365
 
@@ -437,11 +375,7 @@ class AgnoStreamAdapter:
437
375
  self._paused_tool_executions = list(tools)
438
376
  self._paused_requirements = list(requirements)
439
377
 
440
- # RunPausedEvent.tools contains ALL tools from run_response.tools
441
- # (both server-side tools already executed and external ones awaiting
442
- # client execution). We must only synthesize events for external tools
443
- # — the server-side ones (e.g. ReasoningTools' think/analyze) were
444
- # already streamed via the normal tool_call_started/completed path.
378
+ # Only synthesize for external tools; server-side ones already streamed.
445
379
  seen_ids: set[str] = set()
446
380
  for tool_exec in tools:
447
381
  if not getattr(tool_exec, "external_execution_required", False):
@@ -530,8 +464,6 @@ class AgnoStreamAdapter:
530
464
  events.extend(self._close_reasoning(None))
531
465
  return events
532
466
 
533
- # ── Private Helpers ──────────────────────────────────────────────────
534
-
535
467
  def _close_reasoning(self, timestamp: Any) -> list[BaseAgentRunEvent]:
536
468
  """Close active reasoning sequence.
537
469
 
@@ -575,32 +507,24 @@ class AgnoStreamAdapter:
575
507
  return events
576
508
 
577
509
  def _handle_run_content(self, agno_event: Any, timestamp: Any) -> list[BaseAgentRunEvent]:
578
- """Handle RunEvent.run_content the core state machine.
510
+ """Dispatch a ``run_content`` event between reasoning and text channels.
579
511
 
580
- Rules:
581
- - reasoning_content non-empty: reasoning data (close content if transitioning)
582
- - content non-empty: text data (close reasoning if transitioning)
583
- - reasoning_content == "": close reasoning if active
584
- - content == "": close content if active
585
- - None values: ignored
512
+ Non-empty content opens or extends its sequence; empty strings close it.
586
513
 
587
514
  Returns:
588
- List of DigitalKin events for this run_content chunk.
515
+ DigitalKin events for this chunk.
589
516
  """
590
517
  events: list[BaseAgentRunEvent] = []
591
518
 
592
519
  reasoning_content = getattr(agno_event, "reasoning_content", None)
593
520
  content = agno_event.content
594
521
 
595
- # ── Reasoning content handling ──
596
522
  if reasoning_content is not None:
597
523
  events.extend(self._process_reasoning_content(reasoning_content, timestamp))
598
524
 
599
- # ── Text content handling ──
600
525
  if content is not None:
601
526
  events.extend(self._process_text_content(content, timestamp))
602
527
 
603
- # Edge case: neither reasoning_content nor content
604
528
  if reasoning_content is None and content is None:
605
529
  logger.debug("run_content with no content, skipping")
606
530
 
@@ -615,17 +539,13 @@ class AgnoStreamAdapter:
615
539
  events: list[BaseAgentRunEvent] = []
616
540
 
617
541
  if not reasoning_content:
618
- # Empty string "" → signal to close reasoning
619
542
  if self._reasoning_active:
620
543
  events.extend(self._close_reasoning(timestamp))
621
544
  return events
622
545
 
623
- # Non-empty string → reasoning data
624
- # Close text message if transitioning from content to reasoning
625
546
  if self._content_active:
626
547
  events.extend(self._close_content(timestamp))
627
548
 
628
- # Auto-open reasoning on first chunk
629
549
  if not self._reasoning_active:
630
550
  self._current_reasoning_id = str(uuid.uuid4())
631
551
  logger.debug("Reasoning auto-started, id=%s", self._current_reasoning_id)
@@ -659,18 +579,14 @@ class AgnoStreamAdapter:
659
579
  events: list[BaseAgentRunEvent] = []
660
580
 
661
581
  if not content:
662
- # Empty string "" → signal to close text message
663
582
  if self._content_active:
664
583
  events.extend(self._close_content(timestamp))
665
584
  return events
666
585
 
667
- # Non-empty string → text data
668
- # Close reasoning if transitioning from reasoning to content
669
586
  if self._reasoning_active:
670
587
  logger.debug("Reasoning auto-completed (text content arrived)")
671
588
  events.extend(self._close_reasoning(timestamp))
672
589
 
673
- # Auto-open text message on first chunk
674
590
  if not self._content_active:
675
591
  self._current_message_id = str(uuid.uuid4())
676
592
  events.append(