digitalkin 1.0.3.dev0__tar.gz → 1.0.3.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 (262) hide show
  1. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/PKG-INFO +2 -2
  2. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/pyproject.toml +19 -19
  3. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/__version__.py +1 -1
  4. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/hitl.py +122 -54
  5. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/base.py +27 -0
  6. digitalkin-1.0.3.dev2/src/digitalkin/community/agno/toolkits/registry/action.py +339 -0
  7. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/base.py +31 -8
  8. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +9 -1
  9. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +10 -7
  10. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +65 -32
  11. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +4 -2
  12. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/services/action.py +8 -1
  13. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +10 -6
  14. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +9 -1
  15. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +8 -5
  16. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/user_profile.py +4 -1
  17. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/redis_client.py +12 -0
  18. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/gateway_servicer.py +21 -4
  19. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/__init__.py +8 -0
  20. digitalkin-1.0.3.dev2/src/digitalkin/models/module/loaded_tools.py +140 -0
  21. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/module_context.py +89 -5
  22. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/tool_cache.py +70 -10
  23. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/services/registry.py +17 -0
  24. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/redis.py +13 -0
  25. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/_base_module.py +22 -3
  26. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/filesystem/default_filesystem.py +9 -1
  27. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/filesystem/filesystem_strategy.py +10 -0
  28. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/filesystem/grpc_filesystem.py +28 -1
  29. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/default_registry.py +33 -1
  30. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/grpc_registry.py +28 -1
  31. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/registry_strategy.py +46 -1
  32. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/setup/default_setup.py +70 -4
  33. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/setup/grpc_setup.py +71 -2
  34. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/setup/setup_strategy.py +33 -3
  35. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/storage/default_storage.py +28 -8
  36. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/storage/grpc_storage.py +15 -3
  37. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/storage/storage_strategy.py +46 -11
  38. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/user_profile/grpc_user_profile.py +3 -0
  39. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/user_profile/user_profile_strategy.py +3 -0
  40. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin.egg-info/PKG-INFO +2 -2
  41. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin.egg-info/SOURCES.txt +1 -0
  42. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin.egg-info/requires.txt +1 -1
  43. digitalkin-1.0.3.dev0/src/digitalkin/community/agno/toolkits/registry/action.py +0 -177
  44. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/LICENSE +0 -0
  45. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/README.md +0 -0
  46. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/__init__.py +0 -0
  47. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/mock/__init__.py +0 -0
  48. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/mock/mock_pb2.py +0 -0
  49. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  50. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/server_async_insecure.py +0 -0
  51. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/server_async_secure.py +0 -0
  52. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/server_sync_insecure.py +0 -0
  53. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/server_sync_secure.py +0 -0
  54. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/__init__.py +0 -0
  55. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/echo_module.py +0 -0
  56. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/models/__init__.py +0 -0
  57. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/models/input.py +0 -0
  58. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/models/output.py +0 -0
  59. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/models/secret.py +0 -0
  60. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/models/setup.py +0 -0
  61. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/server.py +0 -0
  62. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/triggers/__init__.py +0 -0
  63. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/triggers/message_trigger.py +0 -0
  64. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/__init__.py +0 -0
  65. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/archetype_with_tools_module.py +0 -0
  66. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/cpu_intensive_module.py +0 -0
  67. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/dynamic_setup_module.py +0 -0
  68. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/minimal_llm_module.py +0 -0
  69. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/text_transform_module.py +0 -0
  70. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  71. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  72. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  73. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  74. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  75. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/tests/test_metrics.py +0 -0
  76. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/client.py +0 -0
  77. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/echo_module.py +0 -0
  78. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/models/__init__.py +0 -0
  79. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/models/input.py +0 -0
  80. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/models/output.py +0 -0
  81. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/models/secret.py +0 -0
  82. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/models/setup.py +0 -0
  83. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/server.py +0 -0
  84. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/triggers/__init__.py +0 -0
  85. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/triggers/message_trigger.py +0 -0
  86. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/services/filesystem_module.py +0 -0
  87. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/services/storage_module.py +0 -0
  88. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/setup.cfg +0 -0
  89. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/__init__.py +0 -0
  90. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/__init__.py +0 -0
  91. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/__init__.py +0 -0
  92. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/agno_adapter.py +0 -0
  93. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/agui_tools.py +0 -0
  94. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/models.py +0 -0
  95. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/module_toolkit.py +0 -0
  96. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
  97. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/chat_history.py +0 -0
  98. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
  99. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
  100. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
  101. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
  102. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
  103. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
  104. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/__init__.py +0 -0
  105. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/common/__init__.py +0 -0
  106. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/common/factories.py +0 -0
  107. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/exceptions.py +0 -0
  108. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/job_manager/__init__.py +0 -0
  109. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  110. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
  111. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/profiling/__init__.py +0 -0
  112. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/profiling/step_timer.py +0 -0
  113. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/profiling/task_profiler.py +0 -0
  114. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/resilience/__init__.py +0 -0
  115. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/resilience/bulkhead.py +0 -0
  116. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  117. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/__init__.py +0 -0
  118. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
  119. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
  120. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/module_runner.py +0 -0
  121. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
  122. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
  123. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
  124. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
  125. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
  126. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  127. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/task_executor.py +0 -0
  128. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/task_session.py +0 -0
  129. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/exceptions.py +0 -0
  130. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/__init__.py +0 -0
  131. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  132. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/exceptions.py +0 -0
  133. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  134. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
  135. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
  136. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/m2m_call_registry.py +0 -0
  137. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/module_server.py +0 -0
  138. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
  139. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
  140. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/stream_session.py +0 -0
  141. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  142. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
  143. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
  144. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
  145. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
  146. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
  147. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/logger.py +0 -0
  148. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/__init__.py +0 -0
  149. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/agui_mixin.py +0 -0
  150. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/base_mixin.py +0 -0
  151. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/cost_mixin.py +0 -0
  152. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/file_history_mixin.py +0 -0
  153. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  154. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/logger_mixin.py +0 -0
  155. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/storage_mixin.py +0 -0
  156. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/__init__.py +0 -0
  157. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/core/__init__.py +0 -0
  158. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/core/job_manager_models.py +0 -0
  159. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/core/redis.py +0 -0
  160. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/core/task_monitor.py +0 -0
  161. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/events/__init__.py +0 -0
  162. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/events/agent_events.py +0 -0
  163. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  164. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
  165. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
  166. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/models.py +0 -0
  167. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
  168. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/types.py +0 -0
  169. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/ag_ui.py +0 -0
  170. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/base_types.py +0 -0
  171. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/module.py +0 -0
  172. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/module_types.py +0 -0
  173. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/request_metadata.py +0 -0
  174. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/select_schema.py +0 -0
  175. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/setup_types.py +0 -0
  176. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/tool_reference.py +0 -0
  177. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/utility.py +0 -0
  178. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/services/__init__.py +0 -0
  179. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/services/cost.py +0 -0
  180. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/services/services.py +0 -0
  181. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/services/storage.py +0 -0
  182. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/__init__.py +0 -0
  183. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/gateway.py +0 -0
  184. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/grpc_client.py +0 -0
  185. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/log.py +0 -0
  186. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/module.py +0 -0
  187. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/profiling.py +0 -0
  188. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/queue.py +0 -0
  189. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/registry.py +0 -0
  190. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/resilience.py +0 -0
  191. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/server/__init__.py +0 -0
  192. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/server/channel.py +0 -0
  193. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/server/grpc.py +0 -0
  194. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/server/server.py +0 -0
  195. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/server/servicer.py +0 -0
  196. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/task_manager.py +0 -0
  197. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  198. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/utils/channel.py +0 -0
  199. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/utils/__init__.py +0 -0
  200. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
  201. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/__init__.py +0 -0
  202. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/archetype_module.py +0 -0
  203. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/tool_module.py +0 -0
  204. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/trigger_handler.py +0 -0
  205. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/triggers/__init__.py +0 -0
  206. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
  207. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
  208. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
  209. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/py.typed +0 -0
  210. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/__init__.py +0 -0
  211. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/base_strategy.py +0 -0
  212. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/communication/__init__.py +0 -0
  213. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/communication/communication_strategy.py +0 -0
  214. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/communication/default_communication.py +0 -0
  215. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/communication/exceptions.py +0 -0
  216. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/communication/grpc_communication.py +0 -0
  217. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/cost/__init__.py +0 -0
  218. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  219. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/cost/default_cost.py +0 -0
  220. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/cost/exceptions.py +0 -0
  221. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  222. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/filesystem/__init__.py +0 -0
  223. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/filesystem/exceptions.py +0 -0
  224. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/identity/__init__.py +0 -0
  225. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/identity/default_identity.py +0 -0
  226. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  227. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/__init__.py +0 -0
  228. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/exceptions.py +0 -0
  229. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/registry_models.py +0 -0
  230. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/secret/__init__.py +0 -0
  231. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/secret/default_secret.py +0 -0
  232. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/secret/exceptions.py +0 -0
  233. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/secret/grpc_secret.py +0 -0
  234. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/secret/secret_strategy.py +0 -0
  235. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/services_config.py +0 -0
  236. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/services_models.py +0 -0
  237. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/setup/__init__.py +0 -0
  238. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/setup/exceptions.py +0 -0
  239. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/storage/__init__.py +0 -0
  240. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/storage/exceptions.py +0 -0
  241. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/task_manager/__init__.py +0 -0
  242. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
  243. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/task_manager/exceptions.py +0 -0
  244. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  245. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  246. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/user_profile/__init__.py +0 -0
  247. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  248. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/user_profile/exceptions.py +0 -0
  249. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/__init__.py +0 -0
  250. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/arg_parser.py +0 -0
  251. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/conditional_schema.py +0 -0
  252. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/development_mode_action.py +0 -0
  253. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/dynamic_schema.py +0 -0
  254. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/exceptions.py +0 -0
  255. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  256. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/package_discover.py +0 -0
  257. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/proto_utils.py +0 -0
  258. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/schema_splitter.py +0 -0
  259. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/setup_content_validator.py +0 -0
  260. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  261. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin.egg-info/top_level.txt +0 -0
  262. {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.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.3.dev0
3
+ Version: 1.0.3.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.1.dev4
456
+ Requires-Dist: agentic-mesh-protocol==1.0.1
457
457
  Requires-Dist: agno<3,>=2.8.0
458
458
  Requires-Dist: anyio>=4.13.0
459
459
  Requires-Dist: grpcio-health-checking==1.82.1
@@ -31,7 +31,7 @@
31
31
  # which is how a nested run's output is attributed to its author. Pinned exactly
32
32
  # because it is a dated prerelease; move to >=0.1.21 once that ships stable.
33
33
  "ag-ui-protocol==0.1.21.dev1787220377",
34
- "agentic-mesh-protocol==1.0.1.dev4",
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",
@@ -40,8 +40,8 @@
40
40
  "pydantic-settings>=2.14.1",
41
41
  "pydantic>=2.12.4",
42
42
  "redis[hiredis]>=7.4.0,<9",
43
- ]
44
- version = "1.0.3.dev0"
43
+ ]
44
+ version = "1.0.3.dev2"
45
45
 
46
46
  [project.optional-dependencies]
47
47
  agno = [ "agno>=2.6" ]
@@ -61,22 +61,6 @@ version = "1.0.3.dev0"
61
61
  name = "DigitalKin.ai"
62
62
 
63
63
  [dependency-groups]
64
- tests = [
65
- "fakeredis[lua]>=2.35.1",
66
- "freezegun>=1.5.5",
67
- "grpcio-testing>=1.81.0",
68
- "hdrhistogram>=0.10.3",
69
- "hypothesis>=6.152.8",
70
- "objgraph>=3.6",
71
- "psutil>=7.2.2",
72
- "pytest-asyncio>=1.3.0",
73
- "pytest-benchmark>=5.2.3",
74
- "pytest-cov>=7.1.0",
75
- "pytest-html>=4.2.0",
76
- "pytest-json-report>=1.5.0",
77
- "pytest-timeout>=2.4.0",
78
- "pytest>=9.0.3",
79
- ]
80
64
  dev = [
81
65
  "build>=1.5.0",
82
66
  "bump-my-version>=1.3.0",
@@ -116,6 +100,22 @@ version = "1.0.3.dev0"
116
100
  "mkdocstrings>=1.0.4",
117
101
  "tomli>=2.4.1",
118
102
  ]
103
+ tests = [
104
+ "fakeredis[lua]>=2.35.1",
105
+ "freezegun>=1.5.5",
106
+ "grpcio-testing>=1.81.0",
107
+ "hdrhistogram>=0.10.3",
108
+ "hypothesis>=6.152.8",
109
+ "objgraph>=3.6",
110
+ "psutil>=7.2.2",
111
+ "pytest-asyncio>=1.3.0",
112
+ "pytest-benchmark>=5.2.3",
113
+ "pytest-cov>=7.1.0",
114
+ "pytest-html>=4.2.0",
115
+ "pytest-json-report>=1.5.0",
116
+ "pytest-timeout>=2.4.0",
117
+ "pytest>=9.0.3",
118
+ ]
119
119
  [tool.setuptools]
120
120
  package-dir = { "" = "src" }
121
121
 
@@ -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.3.dev0"
8
+ __version__ = "1.0.3.dev2"
@@ -340,6 +340,40 @@ class AgnoHitlRunner:
340
340
  self._store = store
341
341
  self._dependency_key = dependency_key
342
342
  self._tool_loader = tool_loader
343
+ # Set while a continue is in flight, so _restore_tools can put the factory back.
344
+ self._tools_factory: Any = None
345
+
346
+ def _resolve_tools_for_continue(self, agui_tools: list[AgUiTool] | None) -> None:
347
+ """Hand Agno a concrete tool list for the ``acontinue_run`` about to be issued.
348
+
349
+ A Team's async ``acontinue_run`` never resolves a callable ``tools`` factory, so the
350
+ continued leader would run with an empty function map and every call — not just the
351
+ freshly loaded one — would come back as "the requested tool does not exist".
352
+
353
+ Args:
354
+ agui_tools: Frontend tools to merge in, exactly as the factory would.
355
+ """
356
+ from digitalkin.community.agno.agui_tools import AguiTools
357
+
358
+ factory = vars(self._agent).get("tools")
359
+ if not callable(factory) or isinstance(factory, list):
360
+ return
361
+ if self._tools_factory is None:
362
+ self._tools_factory = factory
363
+ self._agent.tools = [
364
+ *factory(None),
365
+ *[AguiTools.agui_tool_to_external_function(tool) for tool in agui_tools or []],
366
+ ]
367
+
368
+ def _restore_tools(self) -> None:
369
+ """Put the tools factory back after a continue, if one was swapped out.
370
+
371
+ The factory is the steady state: it merges each turn's AG-UI frontend tools on the
372
+ next run, so leaving the resolved list in place would freeze this turn's set.
373
+ """
374
+ if self._tools_factory is not None:
375
+ self._agent.tools = self._tools_factory
376
+ self._tools_factory = None
343
377
 
344
378
  @staticmethod
345
379
  def _find_loader(tools: Any) -> LoadManager | None:
@@ -675,66 +709,70 @@ class AgnoHitlRunner:
675
709
  """
676
710
  from digitalkin.community.agno.agno_adapter import AgnoStreamAdapter
677
711
 
678
- for _ in range(20):
679
- adapter = AgnoStreamAdapter()
680
- final_run_output: RunOutput | None = None
681
-
682
- async for raw_event in stream:
683
- if isinstance(raw_event, run_output_cls):
684
- final_run_output = raw_event
685
- continue
686
- for event in adapter.to_digitalkin_events(raw_event):
687
- await send(event)
712
+ try:
713
+ for _ in range(20):
714
+ adapter = AgnoStreamAdapter()
715
+ final_run_output: RunOutput | None = None
688
716
 
689
- for event in adapter.flush():
690
- await send(event)
717
+ async for raw_event in stream:
718
+ if isinstance(raw_event, run_output_cls):
719
+ final_run_output = raw_event
720
+ continue
721
+ for event in adapter.to_digitalkin_events(raw_event):
722
+ await send(event)
691
723
 
692
- if not (adapter.is_paused and final_run_output is not None and final_run_output.is_paused):
693
- return None
724
+ for event in adapter.flush():
725
+ await send(event)
694
726
 
695
- # Resolve any load_manager calls in-process; if the pause has nothing left for the
696
- # front, auto-continue so discover -> load -> use reads as a single turn.
697
- if await self._load_paused_tools(final_run_output) and not self._pending_external(final_run_output):
698
- # A load appended a ModuleToolkit to the live base_tools list. Agno caches the
699
- # tools-factory output per run (``cache_callables`` defaults to True), so
700
- # ``acontinue_run`` would re-resolve from the stale pre-load cache and the new tool
701
- # would be missing from the model's function map the LLM then gets "the requested
702
- # tool does not exist" when it calls the just-loaded function. Invalidate the
703
- # tools cache so the continue re-invokes the factory and registers the loaded tool.
704
- from agno.utils.callables import aclear_callable_cache # pyright: ignore[reportMissingImports]
705
-
706
- await aclear_callable_cache(self._agent, kind="tools")
707
- stream = self._agent.acontinue_run(
708
- run_response=final_run_output,
709
- stream=True,
710
- stream_events=True,
711
- yield_run_output=True,
712
- dependencies={self._dependency_key: agui_tools or []},
713
- )
714
- continue
727
+ if not (adapter.is_paused and final_run_output is not None and final_run_output.is_paused):
728
+ return None
729
+
730
+ # Resolve any load_manager calls in-process; if the pause has nothing left for the
731
+ # front, auto-continue so discover -> load -> use reads as a single turn.
732
+ if await self._load_paused_tools(final_run_output) and not self._pending_external(final_run_output):
733
+ # Agno caches the tools-factory output per run, so a continue would re-resolve
734
+ # from the stale pre-load cache and miss the just-loaded tool. Invalidate it.
735
+ from agno.utils.callables import aclear_callable_cache # pyright: ignore[reportMissingImports]
736
+
737
+ await aclear_callable_cache(self._agent, kind="tools")
738
+ # ...and hand the continue a resolved list, because a Team never re-invokes the
739
+ # factory on acontinue_run at all. See _resolve_tools_for_continue.
740
+ self._resolve_tools_for_continue(agui_tools)
741
+ stream = self._agent.acontinue_run(
742
+ run_response=final_run_output,
743
+ stream=True,
744
+ stream_events=True,
745
+ yield_run_output=True,
746
+ dependencies={self._dependency_key: agui_tools or []},
747
+ )
748
+ continue
715
749
 
716
- pause_info = await self._store.save(run_output=final_run_output, thread_id=thread_id)
717
- # Attach AG-UI-shaped messages so the front can materialise the tool_call.
718
- pause_info.new_messages = HitlEvents.agno_messages_to_agui(final_run_output.messages or [])
719
- return pause_info
750
+ pause_info = await self._store.save(run_output=final_run_output, thread_id=thread_id)
751
+ # Attach AG-UI-shaped messages so the front can materialise the tool_call.
752
+ pause_info.new_messages = HitlEvents.agno_messages_to_agui(final_run_output.messages or [])
753
+ return pause_info
720
754
 
721
- logger.warning("AgnoHitlRunner: auto-continue limit reached for thread_id=%s", thread_id)
722
- from digitalkin.models.events import AgentRunEvent, RunErrorEvent
755
+ logger.warning("AgnoHitlRunner: auto-continue limit reached for thread_id=%s", thread_id)
756
+ from digitalkin.models.events import AgentRunEvent, RunErrorEvent
723
757
 
724
- await send(
725
- RunErrorEvent(
726
- event=AgentRunEvent.RUN_ERROR,
727
- error_type="auto_continue_limit",
728
- content=(
729
- "The run was stopped after too many consecutive in-process tool "
730
- "loads (load_manager). Send a new message to continue."
731
- ),
732
- error_details=None,
733
- timestamp=None,
734
- metadata=None,
758
+ await send(
759
+ RunErrorEvent(
760
+ event=AgentRunEvent.RUN_ERROR,
761
+ error_type="auto_continue_limit",
762
+ content=(
763
+ "The run was stopped after too many consecutive in-process tool "
764
+ "loads (load_manager). Send a new message to continue."
765
+ ),
766
+ error_details=None,
767
+ timestamp=None,
768
+ metadata=None,
769
+ )
735
770
  )
736
- )
737
- return None
771
+ return None
772
+ finally:
773
+ # The swapped-in list is only valid for the continues issued above; the factory is
774
+ # the steady state every later run resolves from.
775
+ self._restore_tools()
738
776
 
739
777
  async def _load_paused_tools(self, run_output: RunOutput) -> bool:
740
778
  """Resolve ``load_manager`` calls in a paused run, writing each tool result in place.
@@ -752,10 +790,40 @@ class AgnoHitlRunner:
752
790
  loader_tool = self._tool_loader.tool_name
753
791
  for tool in run_output.tools or []:
754
792
  if tool.external_execution_required and tool.result is None and tool.tool_name == loader_tool:
755
- tool.result = await self._tool_loader.run_paused(tool.tool_args or {})
793
+ result = await self._tool_loader.run_paused(tool.tool_args or {})
794
+ tool.result = result
795
+ self._resolve_requirement(run_output, tool.tool_call_id, result)
756
796
  handled = True
757
797
  return handled
758
798
 
799
+ @staticmethod
800
+ def _resolve_requirement(run_output: RunOutput, tool_call_id: str | None, result: str) -> None:
801
+ """Mark the paused run's requirement for ``tool_call_id`` as externally executed.
802
+
803
+ Agno gates ``acontinue_run`` on ``RunRequirement.is_resolved()``, never on
804
+ ``tools[].result``: ``needs_external_execution`` stays True until the requirement's own
805
+ ``external_execution_result`` is set. Writing only the tool result therefore leaves the
806
+ run "still paused" — the continue re-pauses immediately without a model call, the loaded
807
+ tool is never used, and the turn dead-ends on a pause with nothing left for the front to
808
+ resolve. The frontend resume path (:meth:`continue_paused_run`) already syncs
809
+ requirements; the in-process load path must do the same.
810
+
811
+ Args:
812
+ run_output: The paused Agno run whose requirements mirror ``run_output.tools``.
813
+ tool_call_id: The resolved tool call's id; ``None``/empty matches nothing.
814
+ result: The tool result to record on the requirement.
815
+ """
816
+ if not tool_call_id:
817
+ return
818
+ for requirement in run_output.requirements or []:
819
+ tool_execution = requirement.tool_execution
820
+ if (
821
+ tool_execution is not None
822
+ and tool_execution.tool_call_id == tool_call_id
823
+ and requirement.needs_external_execution
824
+ ):
825
+ requirement.set_external_execution_result(result)
826
+
759
827
  @staticmethod
760
828
  def _pending_external(run_output: RunOutput) -> bool:
761
829
  """Report whether any external tool in the paused run still needs a result.
@@ -81,6 +81,33 @@ class DkToolkit(Toolkit):
81
81
  """
82
82
  return json.dumps({"error": error, "metadata": {"success": False, **metadata}}, ensure_ascii=False)
83
83
 
84
+ @staticmethod
85
+ def _nest_action(action: Any, fields: dict[str, Any]) -> Any:
86
+ """Normalise the three shapes a model sends a nested ``action`` object in.
87
+
88
+ The tool schema declares a single ``action`` property holding a discriminated union, but
89
+ models routinely flatten it — sending ``{"action": "search", "query": ""}`` instead of
90
+ ``{"action": {"action": "search", "query": ""}}`` — or serialise the inner object as a
91
+ JSON string. Both are the model reading a nested union schema the obvious way, not a
92
+ malformed call, so they are accepted rather than refused.
93
+
94
+ Args:
95
+ action: The ``action`` argument as received: the object, a JSON string of it, or the
96
+ bare discriminator when the model flattened the call.
97
+ fields: Any sibling keyword arguments, i.e. the flattened action's own fields.
98
+
99
+ Returns:
100
+ The payload to validate: a JSON string is passed through for ``validate_json``,
101
+ anything else comes back as a dict.
102
+ """
103
+ if isinstance(action, str):
104
+ # A JSON string is the inner object already; anything else is the bare discriminator,
105
+ # whose fields were flattened alongside it (empty when the action takes none).
106
+ return action if action.lstrip().startswith("{") else {"action": action, **fields}
107
+ if fields and isinstance(action, dict):
108
+ return {**action, **fields}
109
+ return fields if action is None and fields else action
110
+
84
111
  async def _notify(self, name: str, value: Any) -> None:
85
112
  """Emit an AG-UI custom event on the agent's output stream (best-effort).
86
113