digitalkin 1.0.0.dev4__tar.gz → 1.0.0.dev6__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 (215) hide show
  1. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/PKG-INFO +3 -3
  2. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/pyproject.toml +3 -3
  3. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/__version__.py +1 -1
  4. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/module_runner.py +8 -0
  5. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/proto_streams.py +9 -0
  6. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/gateway_servicer.py +83 -42
  7. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/_base_module.py +8 -3
  8. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/gateway_consumer.py +22 -9
  9. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/PKG-INFO +3 -3
  10. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/requires.txt +2 -2
  11. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/LICENSE +0 -0
  12. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/README.md +0 -0
  13. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/__init__.py +0 -0
  14. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/mock/__init__.py +0 -0
  15. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/mock/mock_pb2.py +0 -0
  16. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  17. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/server_async_insecure.py +0 -0
  18. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/server_async_secure.py +0 -0
  19. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/server_sync_insecure.py +0 -0
  20. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/server_sync_secure.py +0 -0
  21. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/__init__.py +0 -0
  22. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/echo_module.py +0 -0
  23. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/models/__init__.py +0 -0
  24. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/models/input.py +0 -0
  25. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/models/output.py +0 -0
  26. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/models/secret.py +0 -0
  27. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/models/setup.py +0 -0
  28. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/server.py +0 -0
  29. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/triggers/__init__.py +0 -0
  30. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/triggers/message_trigger.py +0 -0
  31. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/__init__.py +0 -0
  32. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/archetype_with_tools_module.py +0 -0
  33. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/cpu_intensive_module.py +0 -0
  34. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/dynamic_setup_module.py +0 -0
  35. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/minimal_llm_module.py +0 -0
  36. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/text_transform_module.py +0 -0
  37. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  38. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  39. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  40. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  41. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  42. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/tests/test_metrics.py +0 -0
  43. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/client.py +0 -0
  44. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/echo_module.py +0 -0
  45. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/__init__.py +0 -0
  46. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/input.py +0 -0
  47. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/output.py +0 -0
  48. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/secret.py +0 -0
  49. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/setup.py +0 -0
  50. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/server.py +0 -0
  51. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/triggers/__init__.py +0 -0
  52. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/triggers/message_trigger.py +0 -0
  53. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/services/filesystem_module.py +0 -0
  54. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/services/storage_module.py +0 -0
  55. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/setup.cfg +0 -0
  56. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/__init__.py +0 -0
  57. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/community/__init__.py +0 -0
  58. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/__init__.py +0 -0
  59. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/agno_adapter.py +0 -0
  60. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/agui_tools.py +0 -0
  61. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/hitl.py +0 -0
  62. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/__init__.py +0 -0
  63. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/common/__init__.py +0 -0
  64. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/common/factories.py +0 -0
  65. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/job_manager/__init__.py +0 -0
  66. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  67. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
  68. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/profiling/__init__.py +0 -0
  69. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/profiling/step_timer.py +0 -0
  70. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/profiling/task_profiler.py +0 -0
  71. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/__init__.py +0 -0
  72. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/bulkhead.py +0 -0
  73. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/graceful_shutdown.py +0 -0
  74. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/session_reaper.py +0 -0
  75. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  76. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/watchdog.py +0 -0
  77. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/__init__.py +0 -0
  78. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
  79. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
  80. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
  81. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/instrumented.py +0 -0
  82. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_checkpoint.py +0 -0
  83. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
  84. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
  85. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
  86. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
  87. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_streams.py +0 -0
  88. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/shadow.py +0 -0
  89. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  90. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/task_executor.py +0 -0
  91. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/task_session.py +0 -0
  92. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/task_wrapper.py +0 -0
  93. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/__init__.py +0 -0
  94. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  95. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/gateway_constants.py +0 -0
  96. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  97. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/interceptors/circuit_breaker_interceptor.py +0 -0
  98. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/module_server.py +0 -0
  99. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
  100. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/stream_error_codes.py +0 -0
  101. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
  102. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/stream_session.py +0 -0
  103. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  104. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
  105. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
  106. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
  107. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
  108. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
  109. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/logger.py +0 -0
  110. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/__init__.py +0 -0
  111. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/agui_mixin.py +0 -0
  112. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/base_mixin.py +0 -0
  113. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/cost_mixin.py +0 -0
  114. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/file_history_mixin.py +0 -0
  115. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  116. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/logger_mixin.py +0 -0
  117. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/storage_mixin.py +0 -0
  118. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/__init__.py +0 -0
  119. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/core/__init__.py +0 -0
  120. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/core/job_manager_models.py +0 -0
  121. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/core/task_monitor.py +0 -0
  122. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/events/__init__.py +0 -0
  123. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/events/agent_events.py +0 -0
  124. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  125. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/grpc_servers/models.py +0 -0
  126. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/grpc_servers/types.py +0 -0
  127. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/__init__.py +0 -0
  128. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/ag_ui.py +0 -0
  129. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/base_types.py +0 -0
  130. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/module.py +0 -0
  131. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/module_context.py +0 -0
  132. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/module_types.py +0 -0
  133. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/request_metadata.py +0 -0
  134. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/select_schema.py +0 -0
  135. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/setup_types.py +0 -0
  136. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/tool_cache.py +0 -0
  137. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/tool_reference.py +0 -0
  138. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/utility.py +0 -0
  139. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/__init__.py +0 -0
  140. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/cost.py +0 -0
  141. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/registry.py +0 -0
  142. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/storage.py +0 -0
  143. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/__init__.py +0 -0
  144. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/consumer.py +0 -0
  145. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/gateway.py +0 -0
  146. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/profiling.py +0 -0
  147. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/redis.py +0 -0
  148. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/__init__.py +0 -0
  149. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/channel.py +0 -0
  150. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/grpc.py +0 -0
  151. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/server.py +0 -0
  152. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  153. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/utils/channel.py +0 -0
  154. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/__init__.py +0 -0
  155. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/archetype_module.py +0 -0
  156. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/tool_module.py +0 -0
  157. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/trigger_handler.py +0 -0
  158. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/__init__.py +0 -0
  159. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
  160. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
  161. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
  162. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/py.typed +0 -0
  163. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/__init__.py +0 -0
  164. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/base_strategy.py +0 -0
  165. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/__init__.py +0 -0
  166. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/communication_strategy.py +0 -0
  167. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/default_communication.py +0 -0
  168. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/grpc_communication.py +0 -0
  169. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/__init__.py +0 -0
  170. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  171. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/default_cost.py +0 -0
  172. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  173. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/__init__.py +0 -0
  174. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
  175. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
  176. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
  177. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/identity/__init__.py +0 -0
  178. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/identity/default_identity.py +0 -0
  179. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  180. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/__init__.py +0 -0
  181. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/default_registry.py +0 -0
  182. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/exceptions.py +0 -0
  183. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/grpc_registry.py +0 -0
  184. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/registry_models.py +0 -0
  185. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/registry_strategy.py +0 -0
  186. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/services_config.py +0 -0
  187. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/services_models.py +0 -0
  188. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/__init__.py +0 -0
  189. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/default_setup.py +0 -0
  190. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/grpc_setup.py +0 -0
  191. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/setup_strategy.py +0 -0
  192. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/__init__.py +0 -0
  193. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/default_storage.py +0 -0
  194. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/grpc_storage.py +0 -0
  195. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  196. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/__init__.py +0 -0
  197. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
  198. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  199. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  200. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/__init__.py +0 -0
  201. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  202. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
  203. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  204. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/__init__.py +0 -0
  205. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/arg_parser.py +0 -0
  206. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/conditional_schema.py +0 -0
  207. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/development_mode_action.py +0 -0
  208. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/dynamic_schema.py +0 -0
  209. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  210. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/package_discover.py +0 -0
  211. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/proto_utils.py +0 -0
  212. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/schema_splitter.py +0 -0
  213. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/SOURCES.txt +0 -0
  214. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  215. {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 1.0.0.dev4
3
+ Version: 1.0.0.dev6
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,12 +453,12 @@ 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.18
456
- Requires-Dist: agentic-mesh-protocol==1.0.0.dev1
456
+ Requires-Dist: agentic-mesh-protocol==1.0.0.dev2
457
457
  Requires-Dist: anyio>=4.13.0
458
458
  Requires-Dist: grpcio-health-checking==1.80.0
459
459
  Requires-Dist: grpcio-reflection==1.80.0
460
460
  Requires-Dist: grpcio-status==1.80.0
461
- Requires-Dist: pydantic>=2.13.4
461
+ Requires-Dist: pydantic>=2.12.4
462
462
  Requires-Dist: pydantic-settings>=2.14.0
463
463
  Requires-Dist: redis[hiredis]<8,>=7.4.0
464
464
  Provides-Extra: performance
@@ -28,16 +28,16 @@
28
28
 
29
29
  dependencies = [
30
30
  "ag-ui-protocol>=0.1.18",
31
- "agentic-mesh-protocol==1.0.0.dev1",
31
+ "agentic-mesh-protocol==1.0.0.dev2",
32
32
  "anyio>=4.13.0",
33
33
  "grpcio-health-checking==1.80.0",
34
34
  "grpcio-reflection==1.80.0",
35
35
  "grpcio-status==1.80.0",
36
- "pydantic>=2.13.4",
36
+ "pydantic>=2.12.4",
37
37
  "pydantic-settings>=2.14.0",
38
38
  "redis[hiredis]>=7.4.0,<8",
39
39
  ]
40
- version = "1.0.0.dev4"
40
+ version = "1.0.0.dev6"
41
41
 
42
42
  [project.optional-dependencies]
43
43
  performance = [ "uvloop>=0.21" ]
@@ -5,4 +5,4 @@ from importlib.metadata import PackageNotFoundError, version
5
5
  try:
6
6
  __version__ = version("digitalkin")
7
7
  except PackageNotFoundError:
8
- __version__ = "1.0.0.dev4"
8
+ __version__ = "1.0.0.dev6"
@@ -115,8 +115,16 @@ class ModuleRunner:
115
115
  nonlocal first_logged
116
116
  data = output_data.model_dump(mode="json")
117
117
  if data.get("root", {}).get("protocol") == "stream.end":
118
+ t_eos_write_start = time.perf_counter_ns()
118
119
  await self._redis_client.xadd(stream_key, {"eos": b"true"})
119
120
  await self._redis_client.expire(stream_key, 60)
121
+ t_eos_write_end = time.perf_counter_ns()
122
+ logger.info(
123
+ "[close-debug] producer_eos_write: xadd_expire=%.2fms t_done_ns=%d task_id=%s",
124
+ (t_eos_write_end - t_eos_write_start) / 1e6,
125
+ t_eos_write_end,
126
+ task_id,
127
+ )
120
128
  return
121
129
  s = struct_pb2.Struct()
122
130
  s.update(data)
@@ -369,11 +369,13 @@ class ProtoStreamReader:
369
369
  """
370
370
  entries_since_save = 0
371
371
  while True:
372
+ t_xread_start = time.perf_counter_ns()
372
373
  result = await self._redis_client.xread(
373
374
  {self._stream_key: self._last_id},
374
375
  count=count,
375
376
  block=block_ms,
376
377
  )
378
+ t_xread_end = time.perf_counter_ns()
377
379
  if not result:
378
380
  continue
379
381
 
@@ -383,6 +385,13 @@ class ProtoStreamReader:
383
385
 
384
386
  eos = fields.get(b"eos", b"")
385
387
  if eos == b"true":
388
+ logger.info(
389
+ "[close-debug] reader_saw_eos: last_xread_block=%.2fms "
390
+ "t_seen_ns=%d task_id=%s",
391
+ (t_xread_end - t_xread_start) / 1e6,
392
+ t_xread_end,
393
+ self._task_id,
394
+ )
386
395
  await self._save_cursor()
387
396
  return
388
397
 
@@ -78,7 +78,13 @@ class GatewayServicer:
78
78
 
79
79
  @staticmethod
80
80
  def _sentinel(seq: int, task_id: str, protocol: str, **fields: Any) -> Any:
81
- """Build a StreamServer carrying a control sentinel.
81
+ """Build a StreamClient carrying a control sentinel (server→client wire).
82
+
83
+ Under dev2 of agentic-mesh-protocol the Stream RPC is
84
+ ``rpc Stream(stream StreamServer) returns (stream StreamClient)``,
85
+ so the server-side response type is ``StreamClient``. ``from_seq``
86
+ on StreamClient is the wire-equivalent of the old ``seq`` field
87
+ (same tag 1, same uint64).
82
88
 
83
89
  ``seq=0`` distinguishes gateway-emitted control entries (validation
84
90
  errors, late-consumer rejections) from Redis-replayed entries
@@ -92,11 +98,11 @@ class GatewayServicer:
92
98
  fields: Additional Struct fields under ``data.root``.
93
99
 
94
100
  Returns:
95
- StreamServer proto.
101
+ StreamClient proto.
96
102
  """
97
103
  s = struct_pb2.Struct()
98
104
  s.update({"root": {"protocol": protocol, **fields}})
99
- return gateway_pb2.StreamServer(seq=seq, task_id=task_id, data=s)
105
+ return gateway_pb2.StreamClient(from_seq=seq, task_id=task_id, data=s)
100
106
 
101
107
  async def _fatal_close(self, task_id: str, code: str, message: str) -> AsyncGenerator:
102
108
  """Yield ``stream.error(fatal=true)`` then ``stream.end`` and return.
@@ -342,27 +348,35 @@ class GatewayServicer:
342
348
 
343
349
  async def Stream( # noqa: C901, PLR0912
344
350
  self,
345
- request_iterator: AsyncIterator,
351
+ request_iterator: AsyncIterator[Any],
346
352
  context: grpc.aio.ServicerContext, # noqa: ARG002
347
- ) -> AsyncGenerator:
348
- """BiDi: client sends StreamClient messages, server yields StreamServer.
349
-
350
- First StreamClient identifies the task and carries the query as
351
- ``data``; the data Struct is delivered to the SDK module as its
352
- first input. Subsequent StreamClient messages provide additional
353
- upstream input (optional).
354
-
355
- Server emits StreamServer per Redis stream entry. First entry is
353
+ ) -> AsyncGenerator[Any, None]:
354
+ """BiDi: client sends StreamServer messages, server yields StreamClient.
355
+
356
+ Dev2 of agentic-mesh-protocol defines the RPC as
357
+ ``rpc Stream(stream StreamServer) returns (stream StreamClient)``.
358
+ The naming is inverted from intuition: ``StreamServer`` is the
359
+ message **sent to** the server (upstream input + resume cursor)
360
+ and ``StreamClient`` is the message **sent to** the client
361
+ (module output + lifecycle sentinels).
362
+
363
+ First StreamServer identifies the task (``task_id``), carries the
364
+ resume cursor in ``seq``, and carries the query in ``data``; the
365
+ Struct is delivered to the SDK module as its first input.
366
+ Subsequent StreamServer messages provide additional upstream input
367
+ (optional).
368
+
369
+ Server emits StreamClient per Redis stream entry. First entry is
356
370
  ``stream.start`` (seeded by StartStream); last is ``stream.end``.
357
371
  Errors are emitted as ``stream.error(fatal=true)`` followed by
358
372
  ``stream.end`` — never via ``context.abort``.
359
373
 
360
374
  Args:
361
- request_iterator: BiDi stream of StreamClient from the client.
375
+ request_iterator: BiDi stream of StreamServer from the client.
362
376
  context: gRPC service context.
363
377
 
364
378
  Yields:
365
- StreamServer — sentinels and SDK module output.
379
+ StreamClient — sentinels and SDK module output.
366
380
  """
367
381
  try:
368
382
  first_msg = await anext(request_iterator)
@@ -370,7 +384,7 @@ class GatewayServicer:
370
384
  return
371
385
 
372
386
  task_id = first_msg.task_id
373
- from_seq = first_msg.from_seq
387
+ from_seq = first_msg.seq
374
388
 
375
389
  if validate_id(task_id, "task_id") is not None:
376
390
  async for out in self._fatal_close(task_id, "INVALID_ARGUMENT", "invalid task_id"):
@@ -378,7 +392,7 @@ class GatewayServicer:
378
392
  return
379
393
 
380
394
  if from_seq > MAX_FROM_SEQ:
381
- async for out in self._fatal_close(task_id, "INVALID_ARGUMENT", "from_seq out of range"):
395
+ async for out in self._fatal_close(task_id, "INVALID_ARGUMENT", "seq out of range"):
382
396
  yield out
383
397
  return
384
398
 
@@ -516,17 +530,23 @@ class GatewayServicer:
516
530
  no dict conversion, no JSON parsing. ~0.1-0.5ms per message
517
531
  instead of ~3-8ms on the JSON path.
518
532
 
519
- Yields bare ``StreamServer`` (seq + data). Lifecycle is encoded
520
- in ``data.root.protocol`` sentinels written by the producer
521
- (``stream.start`` already seeded by StartStream; ``stream.end``
522
- written by the producer's end-of-stream emit).
533
+ Yields ``StreamClient`` messages (the dev2 server→client wire
534
+ type). The ``from_seq`` field carries the monotonic sequence
535
+ number same tag as the legacy ``StreamServer.seq``. Lifecycle
536
+ is encoded in ``data.root.protocol`` sentinels written by the
537
+ producer (``stream.start`` already seeded by StartStream;
538
+ ``stream.end`` emitted explicitly below on reader EOS).
539
+
540
+ Callers that need a ``StreamServer`` (the dial-back outbound
541
+ direction) re-wrap each yielded message; both messages share
542
+ identical field tags so the conversion is a field rename.
523
543
 
524
544
  Args:
525
545
  task_id: Task reference ID.
526
546
  from_seq: Resume point.
527
547
 
528
548
  Yields:
529
- StreamServer messages.
549
+ StreamClient messages.
530
550
  """
531
551
  t0 = time.perf_counter_ns()
532
552
  reader = ProtoStreamReader(task_id, self._redis_client) # type: ignore[arg-type]
@@ -549,14 +569,22 @@ class GatewayServicer:
549
569
  )
550
570
  first = False
551
571
  seq += 1
552
- yield gateway_pb2.StreamServer(seq=seq, task_id=task_id, data=struct_data)
572
+ yield gateway_pb2.StreamClient(from_seq=seq, task_id=task_id, data=struct_data)
553
573
 
554
574
  # Reader exited because EOS was hit (Redis `{"eos": "true"}` marker is
555
575
  # consumed silently by ProtoStreamReader). Emit an explicit stream.end
556
576
  # sentinel so the wire contract is uniform: every stream ends with
557
577
  # exactly one stream.end entry, regardless of how it concluded.
578
+ t_after_reader = time.perf_counter_ns()
558
579
  seq += 1
559
580
  yield self._sentinel(seq, task_id, "stream.end")
581
+ t_after_yield = time.perf_counter_ns()
582
+ logger.info(
583
+ "[close-debug] gateway_stream_end: reader_to_yield=%.2fms t_yielded_ns=%d task_id=%s",
584
+ (t_after_yield - t_after_reader) / 1e6,
585
+ t_after_yield,
586
+ task_id,
587
+ )
560
588
 
561
589
  async def _dial_consumer( # noqa: C901, PLR0912, PLR0915
562
590
  self,
@@ -569,16 +597,16 @@ class GatewayServicer:
569
597
 
570
598
  Flow:
571
599
 
572
- 1. Send ``stream.init`` as the first ``StreamClient``.
600
+ 1. Send ``stream.init`` as the first ``StreamServer``.
573
601
  2. Read the consumer's first ``StreamServer`` — that's the query.
574
602
  3. Push the query onto ``session.input_queue`` so the dispatcher
575
603
  unblocks (matches the M2M client-initiated path).
576
604
  4. Concurrently:
577
605
 
578
- - forward subsequent ``StreamServer`` messages from the
606
+ - forward subsequent ``StreamClient`` messages from the
579
607
  consumer → ``session.input_queue`` (multi-turn input).
580
608
  - pull module outputs from ``_consume_from_redis`` and push
581
- each as a ``StreamClient(task_id, from_seq=<seq>, data=…)``
609
+ each as a ``StreamServer(task_id, from_seq=<seq>, data=…)``
582
610
  to the consumer.
583
611
 
584
612
  5. End cleanly when ``stream.end`` flows through.
@@ -646,12 +674,11 @@ class GatewayServicer:
646
674
  try:
647
675
  state = chan.get_state(try_to_connect=False)
648
676
  return getattr(state, "name", str(state))
649
- except Exception as exc: # noqa: BLE001
677
+ except Exception as exc:
650
678
  return f"err:{type(exc).__name__}"
651
679
 
652
680
  logger.info(
653
- "[dial-debug] channel_ready dt_init=%.3fms ch_state=%s "
654
- "channel_id=%s ref_count=%d cache_keys=%d",
681
+ "[dial-debug] channel_ready dt_init=%.3fms ch_state=%s channel_id=%s ref_count=%d cache_keys=%d",
655
682
  (t_stub - t_dial0) / 1e6,
656
683
  _ch_state(comm._channel),
657
684
  id(comm._channel),
@@ -669,19 +696,28 @@ class GatewayServicer:
669
696
  await release()
670
697
  return
671
698
 
672
- # Build the init StreamClient using the existing _sentinel helper —
673
- # we extract the data Struct from a StreamServer-shaped sentinel.
674
- init_server = self._sentinel(0, task_id, "stream.init")
675
- init_client = gateway_pb2.StreamClient(task_id=task_id, from_seq=0, data=init_server.data)
699
+ # Dial-back contract under dev2's RPC signature
700
+ # ``Stream(stream StreamServer) returns (stream StreamClient)``:
701
+ # - gateway is the gRPC client and sends ``StreamServer``
702
+ # (module output + sentinels) on the request stream.
703
+ # - gateway receives ``StreamClient`` (query + follow-up upstream)
704
+ # on the response stream.
705
+ # ``_consume_from_redis`` yields ``StreamClient`` for the regular
706
+ # consumer-facing path; here we re-wrap each one into the
707
+ # ``StreamServer`` the dial-back wire expects (field tags are
708
+ # identical so it's a rename: ``from_seq`` → ``seq``).
709
+ init_struct = struct_pb2.Struct()
710
+ init_struct.update({"root": {"protocol": "stream.init"}})
711
+ init_server = gateway_pb2.StreamServer(seq=0, task_id=task_id, data=init_struct)
676
712
 
677
713
  # Gate the output drain on the first upstream message arriving:
678
714
  # the dispatcher can't produce anything until the query lands on
679
715
  # session.input_queue, which happens when we receive the consumer's
680
- # first StreamServer reply.
716
+ # first StreamClient reply (carrying the query).
681
717
  output_started = asyncio.Event()
682
718
 
683
719
  async def _outgoing() -> AsyncGenerator:
684
- yield init_client
720
+ yield init_server
685
721
  logger.info(
686
722
  "→ stream.init sent, waiting for consumer query before draining outputs",
687
723
  extra={"task_id": task_id, "mission_id": mission_id, "setup_id": setup_id},
@@ -691,11 +727,11 @@ class GatewayServicer:
691
727
  "✓ Output drain started — streaming module outputs to consumer",
692
728
  extra={"task_id": task_id, "mission_id": mission_id, "setup_id": setup_id},
693
729
  )
694
- async for srv_msg in self._consume_from_redis(task_id, from_seq=0):
695
- yield gateway_pb2.StreamClient(
730
+ async for cli_msg in self._consume_from_redis(task_id, from_seq=0):
731
+ yield gateway_pb2.StreamServer(
696
732
  task_id=task_id,
697
- from_seq=srv_msg.seq,
698
- data=srv_msg.data,
733
+ seq=cli_msg.from_seq,
734
+ data=cli_msg.data,
699
735
  )
700
736
 
701
737
  async def _runner_fatal(code: str, message: str) -> None:
@@ -721,6 +757,12 @@ class GatewayServicer:
721
757
  )
722
758
  responses = stub.Stream(_outgoing(), timeout=DIAL_BACK_BIDI_TIMEOUT_S)
723
759
  first = True
760
+ # `responses` items are deserialised by gRPC as the proto's
761
+ # response type (StreamServer), but per the dial-back contract
762
+ # the consumer is sending StreamClient bytes — the field tags
763
+ # match so reading `.data` / `.task_id` works either way. The
764
+ # consumer-emitted message is the query (first) or follow-up
765
+ # upstream input (subsequent).
724
766
  async for upstream in responses:
725
767
  if not (upstream.data and len(upstream.data.fields) > 0):
726
768
  continue
@@ -781,8 +823,7 @@ class GatewayServicer:
781
823
  except _GrpcUsageError:
782
824
  t_fail = time.perf_counter_ns()
783
825
  logger.warning(
784
- "[dial-debug] UsageError raised dt_total=%.3fms dt_pre_to_call=%.3fms "
785
- "ch_state=%s addr=%s",
826
+ "[dial-debug] UsageError raised dt_total=%.3fms dt_pre_to_call=%.3fms ch_state=%s addr=%s",
786
827
  (t_fail - t_dial0) / 1e6,
787
828
  (t_fail - t_pre_stream) / 1e6,
788
829
  _ch_state(comm._channel),
@@ -832,5 +873,5 @@ class GatewayServicer:
832
873
  removed = await self._registry.unregister(task_id)
833
874
  if removed is not None:
834
875
  await removed.teardown()
835
- except Exception: # noqa: BLE001 — finally must not raise out
876
+ except Exception:
836
877
  logger.exception("end-of-stream unregister failed", extra=log_extra)
@@ -618,7 +618,7 @@ class BaseModule( # Module SDK base class requires many public methods # noqa:
618
618
  timer.mark("init_handlers")
619
619
 
620
620
  self._prepared = True
621
- timer.log("module.prepare", task_id=self.context.session.current_ids().get("task_id", ""))
621
+ timer.log("module.prepare", task_id=self.context.session.current_ids().get("job_id", ""))
622
622
 
623
623
  async def start(
624
624
  self,
@@ -658,7 +658,7 @@ class BaseModule( # Module SDK base class requires many public methods # noqa:
658
658
  self._status = ModuleStatus.FAILED
659
659
  logger.exception("Error during module lifecyle")
660
660
  finally:
661
- timer.log("module.start", task_id=self.context.session.current_ids().get("task_id", ""))
661
+ timer.log("module.start", task_id=self.context.session.current_ids().get("job_id", ""))
662
662
  await self.stop()
663
663
 
664
664
  async def stop(self) -> None:
@@ -694,12 +694,17 @@ class BaseModule( # Module SDK base class requires many public methods # noqa:
694
694
  )
695
695
  t3 = _t.perf_counter_ns()
696
696
  self._status = ModuleStatus.STOPPED
697
+ ids = self.context.session.current_ids()
697
698
  logger.info(
698
- "module.stop: cleanup=%.1fms flush=%.1fms eos=%.1fms total=%.1fms",
699
+ "[close-debug] module.stop: cleanup=%.2fms flush=%.2fms eos=%.2fms "
700
+ "total=%.2fms t_done_ns=%d task_id=%s mission_id=%s",
699
701
  (t1 - t0) / 1e6,
700
702
  (t2 - t1) / 1e6,
701
703
  (t3 - t2) / 1e6,
702
704
  (t3 - t0) / 1e6,
705
+ t3,
706
+ ids.get("job_id", ""),
707
+ ids.get("mission_id", ""),
703
708
  )
704
709
  except Exception:
705
710
  self._status = ModuleStatus.FAILED
@@ -3,9 +3,15 @@
3
3
  A *consumer* (UI, dev tool, eval harness, M2M caller) calls
4
4
  ``StartStream`` on the gateway with ``x-client-address`` metadata, then
5
5
  serves a local ``GatewayService.Stream`` server that the gateway dials
6
- back into. The gateway delivers ``stream.init`` first, the consumer
7
- replies with the query as the first ``StreamServer``, and the gateway
8
- then forwards module outputs as subsequent ``StreamClient`` messages.
6
+ back into. Dial-back contract (inverts the standard Stream RPC roles):
7
+
8
+ - gateway consumer: ``StreamServer`` (``stream.init`` first, then
9
+ module outputs + lifecycle sentinels).
10
+ - consumer → gateway: ``StreamClient`` (the query as the first reply,
11
+ then any follow-up upstream input).
12
+
13
+ Wire-compatible with ``Stream(StreamClient) → StreamServer`` because both
14
+ messages share identical proto field tags.
9
15
 
10
16
  Two construction modes:
11
17
 
@@ -132,10 +138,17 @@ class _TaskHandle:
132
138
  class _DialBackServicer(gateway_service_pb2_grpc.GatewayServiceServicer):
133
139
  """Serves the gateway-initiated ``Stream`` BiDi.
134
140
 
135
- Reads the first ``StreamClient`` (always ``stream.init``), looks up
141
+ Dial-back contract (inverts the standard Stream RPC roles): the
142
+ gateway emits ``StreamServer`` (module output + sentinels) and the
143
+ consumer (this servicer) replies with ``StreamClient`` (query +
144
+ follow-up upstream input). Wire-compatible with the proto's
145
+ ``Stream(StreamClient) → StreamServer`` signature because both
146
+ messages share identical field tags.
147
+
148
+ Reads the first ``StreamServer`` (always ``stream.init``), looks up
136
149
  the matching task, replies with the query as the first
137
- ``StreamServer``, then forwards every subsequent ``StreamClient``
138
- payload onto the per-task output queue.
150
+ ``StreamClient``, then forwards every subsequent ``StreamServer``
151
+ payload (module output) onto the per-task output queue.
139
152
  """
140
153
 
141
154
  def __init__(self, registry: dict[str, _TaskHandle]) -> None:
@@ -143,9 +156,9 @@ class _DialBackServicer(gateway_service_pb2_grpc.GatewayServiceServicer):
143
156
 
144
157
  async def Stream(
145
158
  self,
146
- request_iterator: AsyncIterator[gateway_pb2.StreamClient],
159
+ request_iterator: AsyncIterator[gateway_pb2.StreamServer],
147
160
  context: grpc.aio.ServicerContext, # noqa: ARG002
148
- ) -> AsyncGenerator[gateway_pb2.StreamServer, None]:
161
+ ) -> AsyncGenerator[gateway_pb2.StreamClient, None]:
149
162
  handle: _TaskHandle | None = None
150
163
  try:
151
164
  async for upstream in request_iterator:
@@ -157,7 +170,7 @@ class _DialBackServicer(gateway_service_pb2_grpc.GatewayServiceServicer):
157
170
  extra={"task_id": upstream.task_id},
158
171
  )
159
172
  return
160
- yield gateway_pb2.StreamServer(task_id=handle.task_id, seq=0, data=handle.query)
173
+ yield gateway_pb2.StreamClient(task_id=handle.task_id, from_seq=0, data=handle.query)
161
174
  continue
162
175
  if upstream.data and len(upstream.data.fields) > 0:
163
176
  await handle.output_queue.put(upstream.data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 1.0.0.dev4
3
+ Version: 1.0.0.dev6
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,12 +453,12 @@ 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.18
456
- Requires-Dist: agentic-mesh-protocol==1.0.0.dev1
456
+ Requires-Dist: agentic-mesh-protocol==1.0.0.dev2
457
457
  Requires-Dist: anyio>=4.13.0
458
458
  Requires-Dist: grpcio-health-checking==1.80.0
459
459
  Requires-Dist: grpcio-reflection==1.80.0
460
460
  Requires-Dist: grpcio-status==1.80.0
461
- Requires-Dist: pydantic>=2.13.4
461
+ Requires-Dist: pydantic>=2.12.4
462
462
  Requires-Dist: pydantic-settings>=2.14.0
463
463
  Requires-Dist: redis[hiredis]<8,>=7.4.0
464
464
  Provides-Extra: performance
@@ -1,10 +1,10 @@
1
1
  ag-ui-protocol>=0.1.18
2
- agentic-mesh-protocol==1.0.0.dev1
2
+ agentic-mesh-protocol==1.0.0.dev2
3
3
  anyio>=4.13.0
4
4
  grpcio-health-checking==1.80.0
5
5
  grpcio-reflection==1.80.0
6
6
  grpcio-status==1.80.0
7
- pydantic>=2.13.4
7
+ pydantic>=2.12.4
8
8
  pydantic-settings>=2.14.0
9
9
  redis[hiredis]<8,>=7.4.0
10
10
 
File without changes