digitalkin 1.0.5.dev0__tar.gz → 1.0.5.dev3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/PKG-INFO +2 -2
  2. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/redis_demo/client.py +155 -52
  3. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/services/filesystem_module.py +7 -6
  4. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/pyproject.toml +45 -45
  5. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/__version__.py +1 -1
  6. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/agno_adapter.py +102 -4
  7. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/hitl.py +16 -1
  8. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/models.py +1 -36
  9. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/module_toolkit.py +76 -70
  10. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/base.py +17 -0
  11. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/chat_history.py +64 -29
  12. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/action.py +11 -19
  13. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/base.py +0 -22
  14. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/services/action.py +10 -10
  15. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +1 -1
  16. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/job_manager/single_job_manager.py +37 -16
  17. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/base_task_manager.py +48 -32
  18. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/local_task_manager.py +3 -5
  19. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/module_runner.py +95 -11
  20. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/redis/__init__.py +1 -3
  21. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/redis/redis_client.py +11 -0
  22. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +5 -6
  23. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/redis/redis_signal.py +18 -11
  24. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/task_executor.py +58 -37
  25. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/task_session.py +21 -118
  26. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/gateway_servicer.py +154 -120
  27. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/m2m_call_registry.py +3 -3
  28. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/module_server.py +72 -62
  29. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/module_servicer.py +146 -128
  30. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/stream_registry.py +3 -19
  31. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/stream_session.py +3 -5
  32. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +54 -29
  33. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +1 -43
  34. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +2 -0
  35. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/agui_mixin.py +6 -5
  36. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/file_history_mixin.py +4 -3
  37. digitalkin-1.0.5.dev3/src/digitalkin/mixins/filesystem_mixin.py +220 -0
  38. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/core/task_monitor.py +1 -5
  39. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/events/__init__.py +4 -0
  40. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/events/agent_events.py +17 -2
  41. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/__init__.py +8 -0
  42. digitalkin-1.0.5.dev3/src/digitalkin/models/module/knowledge_files.py +87 -0
  43. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/module_context.py +10 -2
  44. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/tool_cache.py +0 -1
  45. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/tool_reference.py +2 -2
  46. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/utility.py +7 -0
  47. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/services/__init__.py +4 -0
  48. digitalkin-1.0.5.dev3/src/digitalkin/models/services/filesystem.py +127 -0
  49. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/services/registry.py +13 -17
  50. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/services/storage.py +3 -9
  51. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/gateway.py +5 -4
  52. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/redis.py +0 -1
  53. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/server/server.py +0 -2
  54. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/server/servicer.py +1 -2
  55. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/task_manager.py +0 -1
  56. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/_base_module.py +26 -11
  57. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/communication/communication_strategy.py +1 -6
  58. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/communication/default_communication.py +6 -7
  59. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/communication/exceptions.py +0 -4
  60. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/communication/grpc_communication.py +82 -63
  61. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/cost/cost_strategy.py +1 -1
  62. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/cost/default_cost.py +24 -17
  63. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/cost/grpc_cost.py +66 -97
  64. digitalkin-1.0.5.dev3/src/digitalkin/services/filesystem/__init__.py +19 -0
  65. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/filesystem/default_filesystem.py +29 -22
  66. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/filesystem/filesystem_strategy.py +51 -51
  67. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/filesystem/grpc_filesystem.py +93 -143
  68. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/__init__.py +2 -0
  69. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/default_registry.py +22 -0
  70. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/grpc_registry.py +124 -100
  71. digitalkin-1.0.5.dev3/src/digitalkin/services/registry/registry_models.py +15 -0
  72. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/registry_strategy.py +6 -0
  73. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/secret/grpc_secret.py +10 -10
  74. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/services_config.py +10 -2
  75. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/setup/default_setup.py +46 -189
  76. digitalkin-1.0.5.dev3/src/digitalkin/services/setup/grpc_setup.py +406 -0
  77. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/setup/setup_strategy.py +18 -89
  78. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/storage/default_storage.py +5 -2
  79. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/storage/grpc_storage.py +70 -105
  80. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/storage/storage_strategy.py +23 -28
  81. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/user_profile/default_user_profile.py +3 -9
  82. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/user_profile/grpc_user_profile.py +12 -18
  83. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/user_profile/user_profile_strategy.py +3 -7
  84. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/development_mode_action.py +2 -2
  85. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/setup_content_validator.py +0 -24
  86. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin.egg-info/PKG-INFO +2 -2
  87. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin.egg-info/SOURCES.txt +3 -2
  88. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin.egg-info/requires.txt +1 -1
  89. digitalkin-1.0.5.dev0/src/digitalkin/core/task_manager/redis/redis_state.py +0 -124
  90. digitalkin-1.0.5.dev0/src/digitalkin/grpc_servers/interceptors/validation.py +0 -74
  91. digitalkin-1.0.5.dev0/src/digitalkin/mixins/filesystem_mixin.py +0 -46
  92. digitalkin-1.0.5.dev0/src/digitalkin/services/filesystem/__init__.py +0 -7
  93. digitalkin-1.0.5.dev0/src/digitalkin/services/setup/grpc_setup.py +0 -604
  94. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/LICENSE +0 -0
  95. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/README.md +0 -0
  96. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/base_server/__init__.py +0 -0
  97. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/base_server/mock/__init__.py +0 -0
  98. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/base_server/mock/mock_pb2.py +0 -0
  99. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  100. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/base_server/server_async_insecure.py +0 -0
  101. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/base_server/server_async_secure.py +0 -0
  102. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/base_server/server_sync_insecure.py +0 -0
  103. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/base_server/server_sync_secure.py +0 -0
  104. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/bench_module/__init__.py +0 -0
  105. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/bench_module/echo_module.py +0 -0
  106. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/bench_module/models/__init__.py +0 -0
  107. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/bench_module/models/input.py +0 -0
  108. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/bench_module/models/output.py +0 -0
  109. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/bench_module/models/secret.py +0 -0
  110. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/bench_module/models/setup.py +0 -0
  111. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/bench_module/server.py +0 -0
  112. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/bench_module/triggers/__init__.py +0 -0
  113. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/bench_module/triggers/message_trigger.py +0 -0
  114. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/modules/__init__.py +0 -0
  115. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/modules/archetype_with_tools_module.py +0 -0
  116. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/modules/cpu_intensive_module.py +0 -0
  117. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/modules/dynamic_setup_module.py +0 -0
  118. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/modules/minimal_llm_module.py +0 -0
  119. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/modules/text_transform_module.py +0 -0
  120. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  121. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  122. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  123. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  124. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  125. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/monitoring/tests/test_metrics.py +0 -0
  126. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/redis_demo/echo_module.py +0 -0
  127. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/redis_demo/models/__init__.py +0 -0
  128. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/redis_demo/models/input.py +0 -0
  129. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/redis_demo/models/output.py +0 -0
  130. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/redis_demo/models/secret.py +0 -0
  131. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/redis_demo/models/setup.py +0 -0
  132. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/redis_demo/server.py +0 -0
  133. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/redis_demo/triggers/__init__.py +0 -0
  134. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/redis_demo/triggers/message_trigger.py +0 -0
  135. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/examples/services/storage_module.py +0 -0
  136. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/setup.cfg +0 -0
  137. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/__init__.py +0 -0
  138. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/__init__.py +0 -0
  139. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/__init__.py +0 -0
  140. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/agui_tools.py +0 -0
  141. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
  142. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
  143. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
  144. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
  145. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +0 -0
  146. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +0 -0
  147. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
  148. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +0 -0
  149. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +0 -0
  150. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
  151. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
  152. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +0 -0
  153. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +0 -0
  154. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/community/agno/toolkits/user_profile.py +0 -0
  155. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/__init__.py +0 -0
  156. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/common/__init__.py +0 -0
  157. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/common/factories.py +0 -0
  158. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/exceptions.py +0 -0
  159. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/job_manager/__init__.py +0 -0
  160. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  161. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/profiling/__init__.py +0 -0
  162. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/profiling/step_timer.py +0 -0
  163. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/profiling/task_profiler.py +0 -0
  164. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/resilience/__init__.py +0 -0
  165. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/resilience/bulkhead.py +0 -0
  166. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  167. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/__init__.py +0 -0
  168. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
  169. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  170. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/exceptions.py +0 -0
  171. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/__init__.py +0 -0
  172. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  173. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/exceptions.py +0 -0
  174. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  175. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
  176. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
  177. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  178. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
  179. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
  180. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/logger.py +0 -0
  181. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/__init__.py +0 -0
  182. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/base_mixin.py +0 -0
  183. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/cost_mixin.py +0 -0
  184. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/logger_mixin.py +0 -0
  185. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/mixins/storage_mixin.py +0 -0
  186. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/__init__.py +0 -0
  187. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/core/__init__.py +0 -0
  188. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/core/job_manager_models.py +0 -0
  189. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/core/redis.py +0 -0
  190. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  191. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
  192. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
  193. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/models.py +0 -0
  194. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
  195. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/grpc_servers/types.py +0 -0
  196. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/ag_ui.py +0 -0
  197. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/base_types.py +0 -0
  198. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/loaded_tools.py +0 -0
  199. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/module.py +0 -0
  200. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/module_types.py +0 -0
  201. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/request_metadata.py +0 -0
  202. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/select_schema.py +0 -0
  203. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/module/setup_types.py +0 -0
  204. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/services/cost.py +0 -0
  205. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/services/services.py +0 -0
  206. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/__init__.py +0 -0
  207. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/certificate.py +0 -0
  208. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/client/__init__.py +0 -0
  209. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/client/channel.py +0 -0
  210. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/client/circuit_breaker.py +0 -0
  211. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/client/client.py +0 -0
  212. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/client/grpc.py +0 -0
  213. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/log.py +0 -0
  214. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/module.py +0 -0
  215. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/profiling.py +0 -0
  216. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/queue.py +0 -0
  217. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/registry.py +0 -0
  218. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/resilience.py +0 -0
  219. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/server/__init__.py +0 -0
  220. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/server/channel.py +0 -0
  221. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/server/grpc.py +0 -0
  222. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  223. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/settings/utils/channel.py +0 -0
  224. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/utils/__init__.py +0 -0
  225. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
  226. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/__init__.py +0 -0
  227. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/archetype_module.py +0 -0
  228. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/tool_module.py +0 -0
  229. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/trigger_handler.py +0 -0
  230. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/triggers/__init__.py +0 -0
  231. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
  232. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
  233. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
  234. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/py.typed +0 -0
  235. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/__init__.py +0 -0
  236. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/base_strategy.py +0 -0
  237. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/communication/__init__.py +0 -0
  238. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/cost/__init__.py +0 -0
  239. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/cost/exceptions.py +0 -0
  240. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/filesystem/exceptions.py +0 -0
  241. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/identity/__init__.py +0 -0
  242. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/identity/default_identity.py +0 -0
  243. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  244. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/registry/exceptions.py +0 -0
  245. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/secret/__init__.py +0 -0
  246. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/secret/default_secret.py +0 -0
  247. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/secret/exceptions.py +0 -0
  248. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/secret/secret_strategy.py +0 -0
  249. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/services_models.py +0 -0
  250. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/setup/__init__.py +0 -0
  251. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/setup/exceptions.py +0 -0
  252. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/storage/__init__.py +0 -0
  253. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/storage/exceptions.py +0 -0
  254. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/task_manager/__init__.py +0 -0
  255. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
  256. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/task_manager/exceptions.py +0 -0
  257. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  258. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  259. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/user_profile/__init__.py +0 -0
  260. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/services/user_profile/exceptions.py +0 -0
  261. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/__init__.py +0 -0
  262. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/arg_parser.py +0 -0
  263. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/conditional_schema.py +0 -0
  264. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/dynamic_schema.py +0 -0
  265. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/env_manager.py +0 -0
  266. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/env_template.py +0 -0
  267. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/exceptions.py +0 -0
  268. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/json_structure.py +0 -0
  269. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  270. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/package_discover.py +0 -0
  271. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/proto_utils.py +0 -0
  272. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin/utils/schema_splitter.py +0 -0
  273. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  274. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/src/digitalkin.egg-info/top_level.txt +0 -0
  275. {digitalkin-1.0.5.dev0 → digitalkin-1.0.5.dev3}/tests/test_exceptions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 1.0.5.dev0
3
+ Version: 1.0.5.dev3
4
4
  Summary: SDK to build kin used in DigitalKin
5
5
  Author-email: "DigitalKin.ai" <contact@digitalkin.ai>
6
6
  License: Attribution-NonCommercial-ShareAlike 4.0 International
@@ -453,7 +453,7 @@ Requires-Python: >=3.10
453
453
  Description-Content-Type: text/markdown
454
454
  License-File: LICENSE
455
455
  Requires-Dist: ag-ui-protocol==0.1.21.dev1787220377
456
- Requires-Dist: agentic-mesh-protocol==1.0.3.dev0
456
+ Requires-Dist: agentic-mesh-protocol==1.0.2
457
457
  Requires-Dist: agno<3,>=2.8.0
458
458
  Requires-Dist: anyio>=4.13.0
459
459
  Requires-Dist: grpcio-health-checking==1.82.1
@@ -2,10 +2,11 @@
2
2
  """Demo client for the Gateway gRPC service with per-endpoint testing.
3
3
 
4
4
  Subcommands:
5
- full Full pipeline: StartStream → Stream → SendSignal
5
+ full Full pipeline: StartStream → ConsumeStream → SendSignal
6
6
  start StartStream only (unary)
7
- consume Stream on existing task (requires --task-id)
8
- signal SendSignal(cancel) on existing task (requires --task-id)
7
+ consume ConsumeStream on existing task (requires --task-id)
8
+ produce StartStream + ProduceStream (act as Module A)
9
+ signal SendSignal on existing task (requires --task-id)
9
10
  inspect Dump Redis keys for a task (no gRPC)
10
11
 
11
12
  Usage:
@@ -13,7 +14,8 @@ Usage:
13
14
  python client.py full --prompt "Test" --setup '{"uppercase": true, "repeat": 5}'
14
15
  python client.py start --prompt "Hello"
15
16
  python client.py consume --task-id <uuid>
16
- python client.py signal --task-id <uuid>
17
+ python client.py produce --task-id <uuid> --chunks 3
18
+ python client.py signal --task-id <uuid> --action cancel
17
19
  python client.py inspect --task-id <uuid>
18
20
  """
19
21
 
@@ -32,7 +34,7 @@ import grpc
32
34
  import redis.asyncio as aioredis
33
35
  from google.protobuf import json_format, struct_pb2
34
36
 
35
- from agentic_mesh_protocol.gateway.v1 import gateway_dto_pb2, gateway_messages_pb2, gateway_service_pb2_grpc
37
+ from agentic_mesh_protocol.gateway.v1 import gateway_pb2, gateway_service_pb2_grpc
36
38
 
37
39
  # ── ANSI colors ─────────────────────────────────────────────────────
38
40
 
@@ -289,18 +291,29 @@ def _print_diff_report(tracker: RedisTracker, task_id: str) -> None:
289
291
  async def cmd_start(
290
292
  stub: gateway_service_pb2_grpc.GatewayServiceStub,
291
293
  task_id: str,
294
+ prompt: str,
295
+ setup: dict[str, Any] | None,
292
296
  ) -> bool:
293
297
  """StartStream — create a task session.
294
298
 
295
299
  Returns:
296
300
  True if accepted.
297
301
  """
302
+ input_struct = struct_pb2.Struct()
303
+ payload: dict[str, Any] = {
304
+ "root": {"protocol": "message", "text": prompt},
305
+ }
306
+ if setup:
307
+ payload["setup"] = setup
308
+ input_struct.update(payload)
309
+
298
310
  t0 = time.monotonic()
299
311
  resp = await stub.StartStream(
300
- gateway_dto_pb2.StartStreamRequest(
312
+ gateway_pb2.StartStreamRequest(
301
313
  task_id=task_id,
302
- setup_id="setups:demo",
303
- mission_id="missions:demo",
314
+ input=input_struct,
315
+ setup_id="demo-setup",
316
+ mission_id="demo-mission",
304
317
  ),
305
318
  )
306
319
  elapsed = (time.monotonic() - t0) * 1000
@@ -314,58 +327,112 @@ async def cmd_start(
314
327
  async def cmd_consume(
315
328
  stub: gateway_service_pb2_grpc.GatewayServiceStub,
316
329
  task_id: str,
317
- prompt: str,
318
- setup: dict[str, Any] | None,
319
330
  verbose: bool,
320
331
  ) -> list[dict[str, Any]]:
321
- """Stream — send the query, then read module output until ``stream.end``.
332
+ """ConsumeStream — read module output from Redis.
322
333
 
323
334
  Returns:
324
335
  List of received items.
325
336
  """
326
337
  received: list[dict[str, Any]] = []
327
- query: dict[str, Any] = {"root": {"protocol": "message", "text": prompt}}
328
- if setup:
329
- query["setup"] = setup
330
- query_struct = struct_pb2.Struct()
331
- query_struct.update(query)
332
338
 
333
339
  async def _requests() -> AsyncGenerator:
334
- yield gateway_messages_pb2.StreamRequest(task_id=task_id, from_seq=0, data=query_struct)
340
+ yield gateway_pb2.ConsumeStreamRequest(
341
+ init=gateway_pb2.ConsumeStreamInit(task_id=task_id, from_seq=0),
342
+ )
335
343
 
336
344
  t0 = time.monotonic()
337
- async for resp in stub.Stream(_requests()):
338
- root = json_format.MessageToDict(resp.data).get("root", {})
339
- protocol = root.get("protocol", "")
340
- if protocol == "stream.error":
341
- received.append({"seq": resp.seq, "error": root.get("message", "")})
342
- print(f" {RED}error: code={root.get('code')} msg={root.get('message')}{RESET}") # noqa: T201
343
- continue
344
- if protocol == "stream.end":
345
- received.append({"seq": resp.seq, "status": "stream.end"})
346
- print(f" {GREEN}stream.end{RESET} ({(time.monotonic() - t0) * 1000:.1f}ms total)") # noqa: T201
345
+ resp_stream = stub.ConsumeStream(_requests())
346
+ async for resp in resp_stream:
347
+ elapsed = (time.monotonic() - t0) * 1000
348
+ payload_type = resp.WhichOneof("payload")
349
+
350
+ if payload_type == "output":
351
+ data_dict = json_format.MessageToDict(resp.output.data)
352
+ text = data_dict.get("root", {}).get("text", data_dict.get("root", {}).get("protocol", ""))
353
+ received.append({"seq": resp.output.seq, "text": text})
354
+ print(f" {GREEN}seq={resp.output.seq:>2}{RESET} {text}") # noqa: T201
355
+ if verbose:
356
+ print(f" {DIM}{json.dumps(data_dict, ensure_ascii=False)}{RESET}") # noqa: T201
357
+
358
+ elif payload_type == "status":
359
+ state_name = gateway_pb2.StreamState.Name(resp.status.state)
360
+ received.append({"status": state_name})
361
+ color = GREEN if "COMPLETED" in state_name else YELLOW
362
+ print(f" {color}status: {state_name}{RESET} ({elapsed:.1f}ms total)") # noqa: T201
347
363
  break
348
- text = root.get("text", protocol)
349
- received.append({"seq": resp.seq, "text": text})
350
- print(f" {GREEN}seq={resp.seq:>2}{RESET} {text}") # noqa: T201
351
- if verbose:
352
- print(f" {DIM}{json.dumps(root, ensure_ascii=False)}{RESET}") # noqa: T201
364
+
365
+ elif payload_type == "error":
366
+ received.append({"error": resp.error.message})
367
+ print(f" {RED}error: code={resp.error.code} msg={resp.error.message}{RESET}") # noqa: T201
368
+ break
369
+
370
+ elif payload_type == "heartbeat":
371
+ if verbose:
372
+ print(f" {DIM}heartbeat{RESET}") # noqa: T201
353
373
 
354
374
  return received
355
375
 
356
376
 
377
+ async def cmd_produce(
378
+ stub: gateway_service_pb2_grpc.GatewayServiceStub,
379
+ task_id: str,
380
+ prompt: str,
381
+ num_chunks: int,
382
+ ) -> int:
383
+ """ProduceStream — act as Module A, push output chunks.
384
+
385
+ Returns:
386
+ Number of server responses.
387
+ """
388
+ async def _requests() -> AsyncGenerator:
389
+ yield gateway_pb2.ProduceStreamRequest(
390
+ init=gateway_pb2.ProduceStreamInit(task_id=task_id),
391
+ )
392
+ for i in range(num_chunks):
393
+ data = struct_pb2.Struct()
394
+ data.update({
395
+ "root": {
396
+ "protocol": "message",
397
+ "text": f"[{i + 1}/{num_chunks}] {prompt}",
398
+ },
399
+ })
400
+ yield gateway_pb2.ProduceStreamRequest(
401
+ output=gateway_pb2.ProduceStreamOutput(task_id=task_id, data=data),
402
+ )
403
+ await asyncio.sleep(0.05)
404
+
405
+ t0 = time.monotonic()
406
+ resp_stream = stub.ProduceStream(_requests())
407
+ count = 0
408
+ async for resp in resp_stream:
409
+ count += 1
410
+ payload = resp.WhichOneof("payload")
411
+ print(f" response #{count}: {payload}") # noqa: T201
412
+
413
+ elapsed = (time.monotonic() - t0) * 1000
414
+ print(f" {DIM}stream closed ({count} responses, {elapsed:.1f}ms){RESET}") # noqa: T201
415
+ return count
416
+
417
+
357
418
  async def cmd_signal(
358
419
  stub: gateway_service_pb2_grpc.GatewayServiceStub,
359
420
  task_id: str,
421
+ action: str,
360
422
  ) -> bool:
361
- """SendSignal — cancel a running task.
423
+ """SendSignal — send a control signal.
362
424
 
363
425
  Returns:
364
426
  True if accepted.
365
427
  """
428
+ action_enum = (
429
+ gateway_pb2.SIGNAL_ACTION_CANCEL if action == "cancel"
430
+ else gateway_pb2.SIGNAL_ACTION_PAUSE
431
+ )
432
+
366
433
  t0 = time.monotonic()
367
434
  resp = await stub.SendSignal(
368
- gateway_dto_pb2.SendSignalRequest(cancel=gateway_messages_pb2.CancelSignal(task_id=task_id)),
435
+ gateway_pb2.ClientSignalRequest(task_id=task_id, action=action_enum),
369
436
  )
370
437
  elapsed = (time.monotonic() - t0) * 1000
371
438
 
@@ -380,7 +447,7 @@ async def cmd_signal(
380
447
 
381
448
 
382
449
  async def run_full(args: argparse.Namespace) -> None:
383
- """Full pipeline: StartStream → Stream → SendSignal."""
450
+ """Full pipeline: StartStream → ConsumeStream → SendSignal."""
384
451
  task_id = args.task_id or str(uuid.uuid4())
385
452
  setup = json.loads(args.setup) if args.setup else None
386
453
  tracker = RedisTracker(args.redis) if args.verbose else None
@@ -400,7 +467,7 @@ async def run_full(args: argparse.Namespace) -> None:
400
467
 
401
468
  # 1. StartStream
402
469
  print(f"\n{BOLD}[1] StartStream{RESET}") # noqa: T201
403
- accepted = await cmd_start(stub, task_id)
470
+ accepted = await cmd_start(stub, task_id, args.prompt, setup)
404
471
  if not accepted:
405
472
  print(f" {RED}Server rejected the task — aborting.{RESET}") # noqa: T201
406
473
  return
@@ -409,17 +476,18 @@ async def run_full(args: argparse.Namespace) -> None:
409
476
  await asyncio.sleep(0.1)
410
477
  await tracker.snapshot("StartStream", task_id)
411
478
 
412
- # 2. Stream — send the query, read module output
413
- print(f"\n{BOLD}[2] Stream{RESET}") # noqa: T201
414
- received = await cmd_consume(stub, task_id, args.prompt, setup, args.verbose)
479
+ # 2. ConsumeStream — wait for module output
480
+ print(f"\n{BOLD}[2] ConsumeStream{RESET}") # noqa: T201
481
+ await asyncio.sleep(0.2) # let module start
482
+ received = await cmd_consume(stub, task_id, args.verbose)
415
483
 
416
484
  if tracker:
417
485
  await asyncio.sleep(0.1)
418
- await tracker.snapshot("Stream", task_id)
486
+ await tracker.snapshot("ConsumeStream", task_id)
419
487
 
420
488
  # 3. SendSignal
421
489
  print(f"\n{BOLD}[3] SendSignal (cancel){RESET}") # noqa: T201
422
- await cmd_signal(stub, task_id)
490
+ await cmd_signal(stub, task_id, "cancel")
423
491
 
424
492
  if tracker:
425
493
  await asyncio.sleep(0.1)
@@ -445,39 +513,61 @@ async def run_full(args: argparse.Namespace) -> None:
445
513
  async def run_start(args: argparse.Namespace) -> None:
446
514
  """StartStream only."""
447
515
  task_id = args.task_id or str(uuid.uuid4())
516
+ setup = json.loads(args.setup) if args.setup else None
448
517
 
449
518
  print(f"\n{BOLD}[StartStream]{RESET} gateway={args.gateway} task_id={task_id}") # noqa: T201
450
519
 
451
520
  async with grpc.aio.insecure_channel(args.gateway, options=GRPC_OPTIONS) as channel:
452
521
  stub = gateway_service_pb2_grpc.GatewayServiceStub(channel)
453
- await cmd_start(stub, task_id)
522
+ await cmd_start(stub, task_id, args.prompt, setup)
454
523
 
455
524
 
456
525
  async def run_consume(args: argparse.Namespace) -> None:
457
- """Stream on existing task."""
526
+ """ConsumeStream on existing task."""
458
527
  if not args.task_id:
459
528
  print(f"{RED}--task-id is required for consume{RESET}") # noqa: T201
460
529
  sys.exit(1)
461
530
 
531
+ print(f"\n{BOLD}[ConsumeStream]{RESET} gateway={args.gateway} task_id={args.task_id}") # noqa: T201
532
+
533
+ async with grpc.aio.insecure_channel(args.gateway, options=GRPC_OPTIONS) as channel:
534
+ stub = gateway_service_pb2_grpc.GatewayServiceStub(channel)
535
+ await cmd_consume(stub, args.task_id, args.verbose)
536
+
537
+
538
+ async def run_produce(args: argparse.Namespace) -> None:
539
+ """StartStream + ProduceStream (act as Module A)."""
540
+ task_id = args.task_id or str(uuid.uuid4())
462
541
  setup = json.loads(args.setup) if args.setup else None
463
- print(f"\n{BOLD}[Stream]{RESET} gateway={args.gateway} task_id={args.task_id}") # noqa: T201
542
+
543
+ print(f"\n{BOLD}[Produce]{RESET} gateway={args.gateway} task_id={task_id}") # noqa: T201
464
544
 
465
545
  async with grpc.aio.insecure_channel(args.gateway, options=GRPC_OPTIONS) as channel:
466
546
  stub = gateway_service_pb2_grpc.GatewayServiceStub(channel)
467
- await cmd_consume(stub, args.task_id, args.prompt, setup, args.verbose)
547
+
548
+ # StartStream first (registers the session)
549
+ print(f"\n {BOLD}StartStream{RESET}") # noqa: T201
550
+ accepted = await cmd_start(stub, task_id, args.prompt, setup)
551
+ if not accepted:
552
+ print(f" {RED}Rejected{RESET}") # noqa: T201
553
+ return
554
+
555
+ # ProduceStream (act as Module A)
556
+ print(f"\n {BOLD}ProduceStream ({args.chunks} chunks){RESET}") # noqa: T201
557
+ await cmd_produce(stub, task_id, args.prompt, args.chunks)
468
558
 
469
559
 
470
560
  async def run_signal(args: argparse.Namespace) -> None:
471
- """SendSignal(cancel) on existing task."""
561
+ """SendSignal on existing task."""
472
562
  if not args.task_id:
473
563
  print(f"{RED}--task-id is required for signal{RESET}") # noqa: T201
474
564
  sys.exit(1)
475
565
 
476
- print(f"\n{BOLD}[SendSignal]{RESET} gateway={args.gateway} task_id={args.task_id} signal=cancel") # noqa: T201
566
+ print(f"\n{BOLD}[SendSignal]{RESET} gateway={args.gateway} task_id={args.task_id} action={args.action}") # noqa: T201
477
567
 
478
568
  async with grpc.aio.insecure_channel(args.gateway, options=GRPC_OPTIONS) as channel:
479
569
  stub = gateway_service_pb2_grpc.GatewayServiceStub(channel)
480
- await cmd_signal(stub, args.task_id)
570
+ await cmd_signal(stub, args.task_id, args.action)
481
571
 
482
572
 
483
573
  async def run_inspect(args: argparse.Namespace) -> None:
@@ -523,7 +613,8 @@ examples:
523
613
  %(prog)s full --prompt "Test" --setup '{"uppercase": true, "repeat": 5}'
524
614
  %(prog)s start --prompt "Hello"
525
615
  %(prog)s consume --task-id <uuid>
526
- %(prog)s signal --task-id <uuid>
616
+ %(prog)s produce --chunks 5 --prompt "Manual"
617
+ %(prog)s signal --task-id <uuid> --action cancel
527
618
  %(prog)s inspect --task-id <uuid>
528
619
  """,
529
620
  )
@@ -540,16 +631,21 @@ examples:
540
631
  sub = p.add_subparsers(dest="command", help="Endpoint to test")
541
632
 
542
633
  # full (default)
543
- sub.add_parser("full", help="Full pipeline: StartStream -> Stream -> SendSignal")
634
+ sub.add_parser("full", help="Full pipeline: StartStream -> ConsumeStream -> SendSignal")
544
635
 
545
636
  # start
546
637
  sub.add_parser("start", help="StartStream only (unary)")
547
638
 
548
639
  # consume
549
- sub.add_parser("consume", help="Stream on existing task (requires --task-id)")
640
+ sub.add_parser("consume", help="ConsumeStream on existing task (requires --task-id)")
641
+
642
+ # produce
643
+ sp_produce = sub.add_parser("produce", help="StartStream + ProduceStream (act as Module A)")
644
+ sp_produce.add_argument("--chunks", type=int, default=3, help="Number of chunks to produce (default: 3)")
550
645
 
551
646
  # signal
552
- sub.add_parser("signal", help="SendSignal(cancel) on existing task (requires --task-id)")
647
+ sp_signal = sub.add_parser("signal", help="SendSignal on existing task (requires --task-id)")
648
+ sp_signal.add_argument("--action", choices=["cancel", "pause"], default="cancel", help="Signal action (default: cancel)")
553
649
 
554
650
  # inspect
555
651
  sub.add_parser("inspect", help="Dump Redis keys for a task (no gRPC)")
@@ -566,10 +662,17 @@ async def main() -> None:
566
662
  if not args.command:
567
663
  args.command = "full"
568
664
 
665
+ # Set defaults for subcommand-specific args
666
+ if not hasattr(args, "chunks"):
667
+ args.chunks = 3
668
+ if not hasattr(args, "action"):
669
+ args.action = "cancel"
670
+
569
671
  handlers = {
570
672
  "full": run_full,
571
673
  "start": run_start,
572
674
  "consume": run_consume,
675
+ "produce": run_produce,
573
676
  "signal": run_signal,
574
677
  "inspect": run_inspect,
575
678
  }
@@ -10,7 +10,8 @@ from pydantic import BaseModel, Field
10
10
  from digitalkin.logger import logger
11
11
  from digitalkin.models.module import ModuleStatus
12
12
  from digitalkin.modules.archetype_module import ArchetypeModule
13
- from digitalkin.services.filesystem.filesystem_strategy import FileFilter, UploadFileData
13
+ from digitalkin.models.services.filesystem import FileType
14
+ from digitalkin.services.filesystem import FileFilter, UploadFileData
14
15
  from digitalkin.services.services_config import ServicesConfig
15
16
  from digitalkin.services.services_models import ServicesMode
16
17
 
@@ -118,9 +119,9 @@ class ExampleModule(ArchetypeModule[ExampleInput, ExampleOutput, ExampleSetup, E
118
119
  file = UploadFileData(
119
120
  content=b"%s\n%s" % (processed_message.encode(), str(processed_number).encode()),
120
121
  name="example_output.txt",
121
- file_type="text/plain",
122
+ type=FileType.DOCUMENT,
122
123
  content_type="text/plain",
123
- metadata={"example_key": "example_value"},
124
+ metadata={"sdk_created": True},
124
125
  replace_if_exists=True,
125
126
  )
126
127
 
@@ -176,10 +177,10 @@ async def test_module() -> None:
176
177
  # Check the storage
177
178
  if module.status == ModuleStatus.STOPPED:
178
179
  files, _nb_results = await module.filesystem.get_files(
179
- filters=FileFilter(name="example_output.txt", context="test-mission-123"),
180
+ filters=FileFilter(names=["example_output.txt"]),
180
181
  )
181
182
  for file in files:
182
- await module.filesystem.update_file(file.id, file_type="updated")
183
+ await module.filesystem.update_file(file.id, type=FileType.OTHER)
183
184
  # module.filesystem.delete_files(filters=FileFilter(name="example_output.txt", context="test-mission-123"), permanent=True)
184
185
 
185
186
  logger.info("Retrieved file: %s with ID: %s", file.name, file.id)
@@ -188,7 +189,7 @@ async def test_module() -> None:
188
189
  if file_record:
189
190
  logger.info("File ID: %s", file_record.id)
190
191
  logger.info("File name: %s", file_record.name)
191
- logger.info("File type: %s", file_record.file_type)
192
+ logger.info("File type: %s", file_record.type)
192
193
  logger.info("File status: %s", file_record.status)
193
194
  logger.info("File content: %s", file_record.content.decode())
194
195
  except Exception:
@@ -31,7 +31,7 @@
31
31
  # which is how a nested run's output is attributed to its author. Pinned exactly
32
32
  # because it is a dated prerelease; move to >=0.1.21 once that ships stable.
33
33
  "ag-ui-protocol==0.1.21.dev1787220377",
34
- "agentic-mesh-protocol==1.0.3.dev0",
34
+ "agentic-mesh-protocol==1.0.2",
35
35
  "agno>=2.8.0,<3",
36
36
  "anyio>=4.13.0",
37
37
  "grpcio-health-checking==1.82.1",
@@ -41,7 +41,7 @@
41
41
  "pydantic>=2.12.4",
42
42
  "redis[hiredis]>=7.4.0,<9",
43
43
  ]
44
- version = "1.0.5.dev0"
44
+ version = "1.0.5.dev3"
45
45
 
46
46
  [project.optional-dependencies]
47
47
  agno = [ "agno>=2.6" ]
@@ -208,15 +208,15 @@ version = "1.0.5.dev0"
208
208
  ]
209
209
 
210
210
  ignore = [
211
- "ANN401", # Allow typing.Any — gRPC stubs, callbacks, and dynamic APIs require it
212
- "COM812", # Disable because of formatter incompatibility
213
- "DOC502", # Allow extraneous-exception in docstring
214
- "F401", # Allow unused imports — used for availability checks
215
- "N802", # Allow PascalCase methods — gRPC servicer convention
216
- "PLC0415", # Allow lazy imports — needed to break circular dependencies
217
- "PLW3201", # Allow __get_pydantic_core_schema__ — Pydantic dunder hook
218
- "S105", # Hardcoded-password
219
- "S403", # Allow pickle import
211
+ "any-type", # Allow typing.Any — gRPC stubs, callbacks, and dynamic APIs require it
212
+ "missing-trailing-comma", # Disable because of formatter incompatibility
213
+ "docstring-extraneous-exception", # Allow extraneous-exception in docstring
214
+ "unused-import", # Allow unused imports — used for availability checks
215
+ "invalid-function-name", # Allow PascalCase methods — gRPC servicer convention
216
+ "import-outside-top-level", # Allow lazy imports — needed to break circular dependencies
217
+ "bad-dunder-method-name", # Allow __get_pydantic_core_schema__ — Pydantic dunder hook
218
+ "hardcoded-password-string", # Hardcoded-password
219
+ "suspicious-pickle-import", # Allow pickle import
220
220
  ]
221
221
 
222
222
  fixable = [ "ALL" ]
@@ -226,40 +226,40 @@ version = "1.0.5.dev0"
226
226
 
227
227
  [tool.ruff.lint.per-file-ignores]
228
228
  "tests/**/*.py" = [
229
- "ANN001",
230
- "ANN002",
231
- "ANN003",
232
- "ANN201",
233
- "ANN401",
234
- "ARG001",
235
- "ARG002",
236
- "C901",
237
- "D100",
238
- "D101",
239
- "D102",
240
- "D103",
241
- "D107",
242
- "D417",
243
- "DOC201",
244
- "DOC501",
245
- "E501",
246
- "ERA001",
247
- "FBT001",
248
- "FBT002",
249
- "G004",
250
- "N802",
251
- "PERF203",
252
- "PLC2701",
253
- "PLR0911",
254
- "PLR0912",
255
- "PLR0914",
256
- "PLR0915",
257
- "PLR1702",
258
- "PLR2004",
259
- "PLR6301",
260
- "S101",
261
- "SLF001",
262
- "TRY002",
229
+ "missing-type-function-argument",
230
+ "missing-type-args",
231
+ "missing-type-kwargs",
232
+ "missing-return-type-undocumented-public-function",
233
+ "any-type",
234
+ "unused-function-argument",
235
+ "unused-method-argument",
236
+ "complex-structure",
237
+ "undocumented-public-module",
238
+ "undocumented-public-class",
239
+ "undocumented-public-method",
240
+ "undocumented-public-function",
241
+ "undocumented-public-init",
242
+ "undocumented-param",
243
+ "docstring-missing-returns",
244
+ "docstring-missing-exception",
245
+ "line-too-long",
246
+ "commented-out-code",
247
+ "boolean-type-hint-positional-argument",
248
+ "boolean-default-value-positional-argument",
249
+ "logging-f-string",
250
+ "invalid-function-name",
251
+ "try-except-in-loop",
252
+ "import-private-name",
253
+ "too-many-return-statements",
254
+ "too-many-branches",
255
+ "too-many-locals",
256
+ "too-many-statements",
257
+ "too-many-nested-blocks",
258
+ "magic-value-comparison",
259
+ "no-self-use",
260
+ "assert",
261
+ "private-member-access",
262
+ "raise-vanilla-class",
263
263
  ]
264
264
 
265
265
  [tool.ruff.lint.pylint]
@@ -5,4 +5,4 @@ from importlib.metadata import PackageNotFoundError, version
5
5
  try:
6
6
  __version__ = version("digitalkin")
7
7
  except PackageNotFoundError:
8
- __version__ = "1.0.5.dev0"
8
+ __version__ = "1.0.5.dev3"