digitalkin 1.0.0.dev22__tar.gz → 1.0.0.dev24__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.
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/PKG-INFO +2 -2
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/pyproject.toml +2 -2
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/__version__.py +1 -1
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/profiling/step_timer.py +2 -2
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/local_task_manager.py +0 -4
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/module_runner.py +2 -13
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -6
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/redis_signal.py +14 -20
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -4
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/task_session.py +4 -4
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/gateway_servicer.py +46 -69
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/m2m_call_registry.py +1 -8
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/module_server.py +0 -4
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/module_servicer.py +13 -2
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/stream_registry.py +0 -5
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +2 -19
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/logger.py +0 -3
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/agui_mixin.py +0 -4
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/tool_reference.py +3 -3
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/communication/grpc_communication.py +46 -15
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/cost/grpc_cost.py +0 -3
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -3
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/grpc_registry.py +0 -3
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/secret/grpc_secret.py +13 -2
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/services_config.py +6 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/setup/grpc_setup.py +0 -3
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/storage/grpc_storage.py +0 -3
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/task_manager/default_task_manager.py +1 -4
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -3
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin.egg-info/PKG-INFO +2 -2
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin.egg-info/requires.txt +1 -1
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/LICENSE +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/README.md +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/echo_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/models/input.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/models/output.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/models/secret.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/models/setup.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/server.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/client.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/echo_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/models/input.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/models/output.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/models/secret.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/models/setup.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/server.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/services/filesystem_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/services/storage_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/setup.cfg +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/agno/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/agno/agno_adapter.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/agno/agui_tools.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/agno/hitl.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/agno/models.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/resilience/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/resilience/bulkhead.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/_base_server.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/stream_session.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/file_history_mixin.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/core/redis.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/events/agent_events.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/module_context.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/services/registry.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/services/services.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/services/storage.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/gateway.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/grpc_client.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/log.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/profiling.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/queue.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/redis.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/resilience.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/server/channel.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/server/grpc.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/server/server.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/server/servicer.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/task_manager.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/utils/channel.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/_base_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/py.typed +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/communication/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/cost/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/filesystem/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/default_registry.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/registry_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/secret/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/secret/default_secret.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/secret/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/secret/secret_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/setup/default_setup.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/setup/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/setup/setup_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/storage/default_storage.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/storage/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/storage/storage_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/task_manager/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/user_profile/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/development_mode_action.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/exceptions.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin.egg-info/SOURCES.txt +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin.egg-info/top_level.txt +0 -0
- {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/tests/test_exceptions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digitalkin
|
|
3
|
-
Version: 1.0.0.
|
|
3
|
+
Version: 1.0.0.dev24
|
|
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.18
|
|
456
|
-
Requires-Dist: agentic-mesh-protocol==1.0.
|
|
456
|
+
Requires-Dist: agentic-mesh-protocol==1.0.0a2
|
|
457
457
|
Requires-Dist: anyio>=4.13.0
|
|
458
458
|
Requires-Dist: grpcio-health-checking==1.81.0
|
|
459
459
|
Requires-Dist: grpcio-reflection==1.81.0
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
|
|
29
29
|
dependencies = [
|
|
30
30
|
"ag-ui-protocol>=0.1.18",
|
|
31
|
-
"agentic-mesh-protocol==1.0.
|
|
31
|
+
"agentic-mesh-protocol==1.0.0a2",
|
|
32
32
|
"anyio>=4.13.0",
|
|
33
33
|
"grpcio-health-checking==1.81.0",
|
|
34
34
|
"grpcio-reflection==1.81.0",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"pydantic-settings>=2.14.1",
|
|
38
38
|
"redis[hiredis]>=7.4.0,<9",
|
|
39
39
|
]
|
|
40
|
-
version = "1.0.0.
|
|
40
|
+
version = "1.0.0.dev24"
|
|
41
41
|
|
|
42
42
|
[project.optional-dependencies]
|
|
43
43
|
performance = [ "uvloop>=0.21" ]
|
{digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/profiling/step_timer.py
RENAMED
|
@@ -51,9 +51,9 @@ class StepTimer:
|
|
|
51
51
|
total = (self._last - self._t0) / 1e6
|
|
52
52
|
parts.append(f"total={total:.2f}ms")
|
|
53
53
|
if task_id:
|
|
54
|
-
logger.
|
|
54
|
+
logger.debug("[perf] %s: %s task_id=%s", prefix, " ".join(parts), task_id)
|
|
55
55
|
else:
|
|
56
|
-
logger.
|
|
56
|
+
logger.debug("[perf] %s: %s", prefix, " ".join(parts))
|
|
57
57
|
|
|
58
58
|
def total_ms(self) -> float:
|
|
59
59
|
"""Total elapsed time across all marks in milliseconds.
|
|
@@ -91,10 +91,6 @@ class LocalTaskManager(BaseTaskManager):
|
|
|
91
91
|
else:
|
|
92
92
|
# H2: this call never registered a session (e.g. duplicate task_id) —
|
|
93
93
|
# undo only THIS call's admission; never touch the live task.
|
|
94
|
-
logger.info(
|
|
95
|
-
"[VALIDATE H2] create rejected without touching live task: '%s'",
|
|
96
|
-
task_id,
|
|
97
|
-
) # TODO(validate): remove after prod validation
|
|
98
94
|
self._release_admission()
|
|
99
95
|
logger.exception(
|
|
100
96
|
"Failed to create local task: '%s'",
|
{digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/module_runner.py
RENAMED
|
@@ -113,12 +113,6 @@ class ModuleRunner:
|
|
|
113
113
|
await self._redis_client.xadd(stream_key, {"eos": b"true"})
|
|
114
114
|
await self._redis_client.expire(stream_key, stream_settings.redis_stream_ttl)
|
|
115
115
|
t_eos_write_end = time.perf_counter_ns()
|
|
116
|
-
logger.info(
|
|
117
|
-
"[VALIDATE M4] proto stream wrote %d seq'd entries (maxlen=%d): task_id=%s",
|
|
118
|
-
seq,
|
|
119
|
-
stream_maxlen,
|
|
120
|
-
task_id,
|
|
121
|
-
) # TODO(validate): remove after prod validation
|
|
122
116
|
logger.info(
|
|
123
117
|
"[close-debug] producer_eos_write: xadd_expire=%.2fms t_done_ns=%d task_id=%s",
|
|
124
118
|
(t_eos_write_end - t_eos_write_start) / 1e6,
|
|
@@ -137,8 +131,8 @@ class ModuleRunner:
|
|
|
137
131
|
# Arm a TTL on first XADD; final EXPIRE on stream.end shortens it.
|
|
138
132
|
if not first_logged:
|
|
139
133
|
elapsed_ms = (time.perf_counter_ns() - runner_start_ns) / 1e6
|
|
140
|
-
logger.
|
|
141
|
-
"[
|
|
134
|
+
logger.debug(
|
|
135
|
+
"[perf] producer_first_byte_to_redis: %.1fms task_id=%s",
|
|
142
136
|
elapsed_ms,
|
|
143
137
|
task_id,
|
|
144
138
|
extra=log_extra,
|
|
@@ -218,11 +212,6 @@ class ModuleRunner:
|
|
|
218
212
|
logger.exception("ModuleRunner: backpressure timeout", extra=log_extra)
|
|
219
213
|
await on_fatal(StreamErrorCode.BACKPRESSURE_TIMEOUT.value, str(exc))
|
|
220
214
|
except RedisError as exc:
|
|
221
|
-
logger.error(
|
|
222
|
-
"[VALIDATE R2] ModuleRunner: Redis unavailable writing output: task_id=%s",
|
|
223
|
-
task_id,
|
|
224
|
-
extra=log_extra,
|
|
225
|
-
) # TODO(validate): remove after prod validation
|
|
226
215
|
await on_fatal(
|
|
227
216
|
StreamErrorCode.REDIS_UNAVAILABLE.value,
|
|
228
217
|
f"redis unavailable: {type(exc).__name__}: {exc}",
|
|
@@ -150,12 +150,6 @@ class ProtoStreamReader:
|
|
|
150
150
|
s.ParseFromString(pb_bytes)
|
|
151
151
|
except DecodeError:
|
|
152
152
|
# M6: poison entry (truncated/corrupt pb) — drop it, keep the stream alive.
|
|
153
|
-
logger.warning(
|
|
154
|
-
"[VALIDATE M6] dropped corrupt proto stream entry: task_id=%s seq=%d bytes=%d",
|
|
155
|
-
self._task_id,
|
|
156
|
-
seq,
|
|
157
|
-
len(pb_bytes),
|
|
158
|
-
) # TODO(validate): remove after prod validation
|
|
159
153
|
continue
|
|
160
154
|
yield s
|
|
161
155
|
|
|
@@ -108,8 +108,8 @@ class SharedRedisListener:
|
|
|
108
108
|
self._pubsub = self._redis_client.pubsub()
|
|
109
109
|
await self._pubsub.psubscribe("signal_ch:*")
|
|
110
110
|
psub_ms = (time.perf_counter_ns() - psub_t0) / 1e6
|
|
111
|
-
logger.
|
|
112
|
-
"[
|
|
111
|
+
logger.debug(
|
|
112
|
+
"[perf] signal_psubscribe: psubscribe_ms=%.2f pattern=signal_ch:* phase=boot origin=%s",
|
|
113
113
|
psub_ms,
|
|
114
114
|
SharedRedisListener.PROCESS_ID,
|
|
115
115
|
)
|
|
@@ -142,8 +142,8 @@ class SharedRedisListener:
|
|
|
142
142
|
task.add_done_callback(lambda _: self.unregister(task_id))
|
|
143
143
|
|
|
144
144
|
self._counters["subscribed"] += 1
|
|
145
|
-
logger.
|
|
146
|
-
"[
|
|
145
|
+
logger.debug(
|
|
146
|
+
"[perf] signal_subscribe: register_ms=%.2f active_subs=%d task_id=%s origin=%s",
|
|
147
147
|
(time.perf_counter_ns() - reg_t0) / 1e6,
|
|
148
148
|
len(self._task_refs),
|
|
149
149
|
task_id,
|
|
@@ -176,14 +176,11 @@ class SharedRedisListener:
|
|
|
176
176
|
if action.startswith("invalidate_"):
|
|
177
177
|
origin = data.get("origin")
|
|
178
178
|
if origin is not None and origin == SharedRedisListener.PROCESS_ID:
|
|
179
|
-
logger.debug(
|
|
180
|
-
"[VALIDATE D3b] skipped self-originated invalidate action=%s", action
|
|
181
|
-
) # TODO(validate): remove after prod validation
|
|
182
179
|
return True
|
|
183
180
|
setup_id = data.get("setup_id", "")
|
|
184
181
|
self._counters["invalidated"] += 1
|
|
185
|
-
logger.
|
|
186
|
-
"[
|
|
182
|
+
logger.debug(
|
|
183
|
+
"[perf] signal_invalidate: e2e_ms=%.2f action=%s setup_id=%s",
|
|
187
184
|
e2e_ms,
|
|
188
185
|
action,
|
|
189
186
|
setup_id,
|
|
@@ -196,8 +193,8 @@ class SharedRedisListener:
|
|
|
196
193
|
inv_task.add_done_callback(log_unhandled)
|
|
197
194
|
return True
|
|
198
195
|
|
|
199
|
-
logger.
|
|
200
|
-
"[
|
|
196
|
+
logger.debug(
|
|
197
|
+
"[perf] signal_dispatch: e2e_ms=%.2f dispatch_ms=%.2f action=%s task_id=%s",
|
|
201
198
|
e2e_ms,
|
|
202
199
|
(time.perf_counter_ns() - dispatch_t0) / 1e6,
|
|
203
200
|
action,
|
|
@@ -253,8 +250,8 @@ class SharedRedisListener:
|
|
|
253
250
|
psub_t0 = time.perf_counter_ns()
|
|
254
251
|
await self._pubsub.psubscribe("signal_ch:*")
|
|
255
252
|
psub_ms = (time.perf_counter_ns() - psub_t0) / 1e6
|
|
256
|
-
logger.
|
|
257
|
-
"[
|
|
253
|
+
logger.debug(
|
|
254
|
+
"[perf] signal_psubscribe: psubscribe_ms=%.2f pattern=signal_ch:* phase=loop",
|
|
258
255
|
psub_ms,
|
|
259
256
|
)
|
|
260
257
|
msg = await self._pubsub.get_message(ignore_subscribe_messages=True, timeout=0.5)
|
|
@@ -264,8 +261,8 @@ class SharedRedisListener:
|
|
|
264
261
|
route_task_id, data, raw_json = parsed
|
|
265
262
|
pub_ns = data.get("published_at_ns") or 0
|
|
266
263
|
e2e_ms = (time.time_ns() - pub_ns) / 1e6 if pub_ns else 0.0
|
|
267
|
-
logger.
|
|
268
|
-
"[
|
|
264
|
+
logger.debug(
|
|
265
|
+
"[perf] signal_route: e2e_ms=%.2f action=%s task_id=%s",
|
|
269
266
|
e2e_ms,
|
|
270
267
|
data.get("action", ""),
|
|
271
268
|
route_task_id,
|
|
@@ -279,9 +276,6 @@ class SharedRedisListener:
|
|
|
279
276
|
if self._pubsub is not None:
|
|
280
277
|
with contextlib.suppress(Exception):
|
|
281
278
|
await self._pubsub.aclose()
|
|
282
|
-
logger.info(
|
|
283
|
-
"[VALIDATE D3a] closed stale pubsub before reconnect (backoff=%.1fs)", backoff
|
|
284
|
-
) # TODO(validate): remove after prod validation
|
|
285
279
|
self._pubsub = None
|
|
286
280
|
logger.exception("SharedRedisListener iteration error, retrying in %.1fs", backoff)
|
|
287
281
|
await asyncio.sleep(backoff)
|
|
@@ -290,8 +284,8 @@ class SharedRedisListener:
|
|
|
290
284
|
now = time.monotonic()
|
|
291
285
|
if now - self._last_counters_log >= 60.0: # noqa: PLR2004
|
|
292
286
|
c = self._counters
|
|
293
|
-
logger.
|
|
294
|
-
"[
|
|
287
|
+
logger.debug(
|
|
288
|
+
"[perf] signal_counters: origin=%s received=%d deduped=%d evicted=%d "
|
|
295
289
|
"dropped=%d listener_restarts=%d active_subs=%d subscribed_total=%d "
|
|
296
290
|
"invalidated=%d",
|
|
297
291
|
SharedRedisListener.PROCESS_ID,
|
|
@@ -72,10 +72,6 @@ class RemoteTaskManager(BaseTaskManager):
|
|
|
72
72
|
else:
|
|
73
73
|
# H2: this call never registered a session (e.g. duplicate task_id) —
|
|
74
74
|
# undo only THIS call's admission; never touch the live task.
|
|
75
|
-
logger.info(
|
|
76
|
-
"[VALIDATE H2] remote create rejected without touching live task: '%s'",
|
|
77
|
-
task_id,
|
|
78
|
-
) # TODO(validate): remove after prod validation
|
|
79
75
|
self._release_admission()
|
|
80
76
|
logger.exception(
|
|
81
77
|
"Failed to register remote task: '%s'",
|
{digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/task_session.py
RENAMED
|
@@ -208,8 +208,8 @@ class TaskSession:
|
|
|
208
208
|
pub_ns = self.last_signal_published_ns
|
|
209
209
|
e2e_ms = (time.time_ns() - pub_ns) / 1e6 if pub_ns else 0.0
|
|
210
210
|
self.last_signal_published_ns = 0
|
|
211
|
-
logger.
|
|
212
|
-
"[
|
|
211
|
+
logger.debug(
|
|
212
|
+
"[perf] signal_handle: handler=cancel reason=%s e2e_ms=%.2f "
|
|
213
213
|
"body_ms=%.2f ack_send_ms=%.2f ack_ok=%s task_id=%s",
|
|
214
214
|
reason.value,
|
|
215
215
|
e2e_ms,
|
|
@@ -263,8 +263,8 @@ class TaskSession:
|
|
|
263
263
|
pub_ns = self.last_signal_published_ns
|
|
264
264
|
e2e_ms = (time.time_ns() - pub_ns) / 1e6 if pub_ns else 0.0
|
|
265
265
|
self.last_signal_published_ns = 0
|
|
266
|
-
logger.
|
|
267
|
-
"[
|
|
266
|
+
logger.debug(
|
|
267
|
+
"[perf] signal_handle: handler=stop reason=%s e2e_ms=%.2f "
|
|
268
268
|
"body_ms=%.2f ack_send_ms=%.2f ack_ok=%s task_id=%s",
|
|
269
269
|
CancellationReason.SIGNAL_SERVICE_STOP.value,
|
|
270
270
|
e2e_ms,
|
{digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/gateway_servicer.py
RENAMED
|
@@ -7,6 +7,7 @@ import contextlib
|
|
|
7
7
|
import json
|
|
8
8
|
import random
|
|
9
9
|
import time
|
|
10
|
+
import uuid
|
|
10
11
|
from datetime import datetime, timezone
|
|
11
12
|
from typing import TYPE_CHECKING, Any
|
|
12
13
|
|
|
@@ -158,7 +159,46 @@ class GatewayServicer:
|
|
|
158
159
|
await self._m2m.stop()
|
|
159
160
|
await self._registry.shutdown()
|
|
160
161
|
|
|
161
|
-
async def
|
|
162
|
+
async def AssociateTask(
|
|
163
|
+
self,
|
|
164
|
+
request: Any,
|
|
165
|
+
context: grpc.aio.ServicerContext, # noqa: ARG002
|
|
166
|
+
) -> Any:
|
|
167
|
+
"""Mint a sub-task id linked to a running parent task.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
request: AssociateTaskRequest proto.
|
|
171
|
+
context: gRPC service context.
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
AssociateTaskResponse(task_id, parent_task_id); empty ``task_id`` on rejection.
|
|
175
|
+
"""
|
|
176
|
+
parent_task_id = request.parent_task_id
|
|
177
|
+
err = GatewayValidator.validate_id(parent_task_id, "parent_task_id")
|
|
178
|
+
if err is not None:
|
|
179
|
+
logger.warning("AssociateTask rejected: %s", err)
|
|
180
|
+
return gateway_pb2.AssociateTaskResponse(task_id="", parent_task_id=parent_task_id)
|
|
181
|
+
|
|
182
|
+
child_task_id = str(uuid.uuid4())
|
|
183
|
+
ttl = get_gateway_settings().stream.redis_stream_initial_ttl
|
|
184
|
+
try:
|
|
185
|
+
await self._redis_client.sadd(f"task:{parent_task_id}:children", child_task_id)
|
|
186
|
+
await self._redis_client.expire(f"task:{parent_task_id}:children", ttl)
|
|
187
|
+
await self._redis_client.set(f"task:{child_task_id}:parent", parent_task_id, ex=ttl)
|
|
188
|
+
except RedisError:
|
|
189
|
+
logger.warning(
|
|
190
|
+
"[VALIDATE AT1] AssociateTask persist failed parent=%s → task_id=''",
|
|
191
|
+
parent_task_id,
|
|
192
|
+
exc_info=True,
|
|
193
|
+
) # TODO(validate): remove after prod validation
|
|
194
|
+
return gateway_pb2.AssociateTaskResponse(task_id="", parent_task_id=parent_task_id)
|
|
195
|
+
|
|
196
|
+
logger.info(
|
|
197
|
+
"[VALIDATE AT1] AssociateTask: parent=%s child=%s", parent_task_id, child_task_id
|
|
198
|
+
) # TODO(validate): remove after prod validation
|
|
199
|
+
return gateway_pb2.AssociateTaskResponse(task_id=child_task_id, parent_task_id=parent_task_id)
|
|
200
|
+
|
|
201
|
+
async def StartStream( # noqa: PLR0911
|
|
162
202
|
self,
|
|
163
203
|
request: Any,
|
|
164
204
|
context: grpc.aio.ServicerContext,
|
|
@@ -209,11 +249,6 @@ class GatewayServicer:
|
|
|
209
249
|
return gateway_pb2.StartStreamResponse(accepted=False, task_id=task_id)
|
|
210
250
|
|
|
211
251
|
if self._registry.get(task_id) is not None:
|
|
212
|
-
logger.info(
|
|
213
|
-
"[VALIDATE RD1] StartStream refused: a dial is already live for task_id=%s",
|
|
214
|
-
task_id,
|
|
215
|
-
extra=log_extra,
|
|
216
|
-
) # TODO(validate): remove after prod validation
|
|
217
252
|
return gateway_pb2.StartStreamResponse(accepted=False, task_id=task_id)
|
|
218
253
|
timer.mark("dedup_check")
|
|
219
254
|
|
|
@@ -224,20 +259,9 @@ class GatewayServicer:
|
|
|
224
259
|
try:
|
|
225
260
|
claim = await self._idempotency.claim(task_id, SharedRedisListener.PROCESS_ID)
|
|
226
261
|
except RedisError:
|
|
227
|
-
logger.warning(
|
|
228
|
-
"[VALIDATE R2] StartStream claim Redis failure → accepted=False",
|
|
229
|
-
extra=log_extra,
|
|
230
|
-
exc_info=True,
|
|
231
|
-
) # TODO(validate): remove after prod validation
|
|
232
262
|
return gateway_pb2.StartStreamResponse(accepted=False, task_id=task_id)
|
|
233
263
|
timer.mark("idempotency_claim")
|
|
234
264
|
if claim is not ClaimResult.CLAIMED:
|
|
235
|
-
logger.info(
|
|
236
|
-
"[VALIDATE RD1] StartStream refused: task already claimed/running task_id=%s (%s)",
|
|
237
|
-
task_id,
|
|
238
|
-
claim.name,
|
|
239
|
-
extra=log_extra,
|
|
240
|
-
) # TODO(validate): remove after prod validation
|
|
241
265
|
return gateway_pb2.StartStreamResponse(accepted=False, task_id=task_id)
|
|
242
266
|
|
|
243
267
|
session = StreamSession(task_id=task_id)
|
|
@@ -272,11 +296,6 @@ class GatewayServicer:
|
|
|
272
296
|
{"pb": start_info.SerializeToString(), "seq": "0"},
|
|
273
297
|
)
|
|
274
298
|
except RedisError:
|
|
275
|
-
logger.warning(
|
|
276
|
-
"[VALIDATE R2] StartStream xadd(stream.start) Redis failure → accepted=False",
|
|
277
|
-
extra=log_extra,
|
|
278
|
-
exc_info=True,
|
|
279
|
-
) # TODO(validate): remove after prod validation
|
|
280
299
|
# Claimed + registered but the stream couldn't be seeded: undo both so a retry re-runs.
|
|
281
300
|
with contextlib.suppress(RedisError):
|
|
282
301
|
await self._idempotency.release(task_id)
|
|
@@ -533,8 +552,8 @@ class GatewayServicer:
|
|
|
533
552
|
extra=log_extra,
|
|
534
553
|
exc_info=True,
|
|
535
554
|
)
|
|
536
|
-
logger.
|
|
537
|
-
"[
|
|
555
|
+
logger.debug(
|
|
556
|
+
"[perf] SendSignal: %s path=cache total=%.2fms action=%s setup_id=%s",
|
|
538
557
|
timer.format_steps(),
|
|
539
558
|
timer.total_ms(),
|
|
540
559
|
action_name,
|
|
@@ -580,8 +599,8 @@ class GatewayServicer:
|
|
|
580
599
|
await self._redis_client.publish(f"signal_ch:{task_id}", payload)
|
|
581
600
|
timer.mark("redis_publish")
|
|
582
601
|
last_mark = "redis_publish"
|
|
583
|
-
logger.
|
|
584
|
-
"[
|
|
602
|
+
logger.debug(
|
|
603
|
+
"[perf] SendSignal: %s path=redis total=%.2fms action=%s task_id=%s",
|
|
585
604
|
timer.format_steps(),
|
|
586
605
|
timer.total_ms(),
|
|
587
606
|
action_name,
|
|
@@ -690,12 +709,6 @@ class GatewayServicer:
|
|
|
690
709
|
except StopAsyncIteration:
|
|
691
710
|
return
|
|
692
711
|
except asyncio.TimeoutError:
|
|
693
|
-
logger.warning(
|
|
694
|
-
"[VALIDATE B1] stream read idle %.0fs with no EOS (producer likely died) — "
|
|
695
|
-
"closing stream: task_id=%s",
|
|
696
|
-
idle,
|
|
697
|
-
task_id,
|
|
698
|
-
) # TODO(validate): remove after prod validation
|
|
699
712
|
yield self._sentinel(
|
|
700
713
|
0,
|
|
701
714
|
task_id,
|
|
@@ -707,10 +720,6 @@ class GatewayServicer:
|
|
|
707
720
|
yield self._sentinel(0, task_id, "stream.end")
|
|
708
721
|
return
|
|
709
722
|
except RedisError:
|
|
710
|
-
logger.warning(
|
|
711
|
-
"[VALIDATE R2] stream read Redis failure — closing stream: task_id=%s",
|
|
712
|
-
task_id,
|
|
713
|
-
) # TODO(validate): remove after prod validation
|
|
714
723
|
yield self._sentinel(
|
|
715
724
|
0,
|
|
716
725
|
task_id,
|
|
@@ -791,21 +800,9 @@ class GatewayServicer:
|
|
|
791
800
|
if deadline is None:
|
|
792
801
|
deadline = now + reconnect.window_s
|
|
793
802
|
if now >= deadline:
|
|
794
|
-
logger.info(
|
|
795
|
-
"[VALIDATE RD1] dial-back gave up after %.0fs reconnect window: task_id=%s attempts=%d",
|
|
796
|
-
reconnect.window_s,
|
|
797
|
-
task_id,
|
|
798
|
-
attempt,
|
|
799
|
-
) # TODO(validate): remove after prod validation
|
|
800
803
|
break
|
|
801
804
|
attempt += 1
|
|
802
805
|
delay = min(random.uniform(reconnect.backoff_base_s, reconnect.backoff_max_s), deadline - now) # noqa: S311
|
|
803
|
-
logger.info(
|
|
804
|
-
"[VALIDATE RD1] dial-back disconnected — re-dial attempt %d in %.1fs (resume): task_id=%s",
|
|
805
|
-
attempt,
|
|
806
|
-
delay,
|
|
807
|
-
task_id,
|
|
808
|
-
) # TODO(validate): remove after prod validation
|
|
809
806
|
await asyncio.sleep(max(0.0, delay))
|
|
810
807
|
resume = True
|
|
811
808
|
finally:
|
|
@@ -990,11 +987,6 @@ class GatewayServicer:
|
|
|
990
987
|
)
|
|
991
988
|
return
|
|
992
989
|
except RedisError:
|
|
993
|
-
logger.warning(
|
|
994
|
-
"[VALIDATE R2] dial-back stream read Redis failure — closing BiDi: task_id=%s",
|
|
995
|
-
task_id,
|
|
996
|
-
extra=log_extra,
|
|
997
|
-
) # TODO(validate): remove after prod validation
|
|
998
990
|
for sc in (
|
|
999
991
|
self._sentinel(
|
|
1000
992
|
0,
|
|
@@ -1063,14 +1055,6 @@ class GatewayServicer:
|
|
|
1063
1055
|
if first and resume:
|
|
1064
1056
|
limit = get_gateway_settings().stream.from_seq_limit
|
|
1065
1057
|
resume_cursor = min(upstream.from_seq, limit)
|
|
1066
|
-
if upstream.from_seq > limit:
|
|
1067
|
-
logger.warning(
|
|
1068
|
-
"[VALIDATE RESUME1] resume cursor %d exceeds limit %d, clamped: task_id=%s",
|
|
1069
|
-
upstream.from_seq,
|
|
1070
|
-
limit,
|
|
1071
|
-
task_id,
|
|
1072
|
-
extra=log_extra,
|
|
1073
|
-
) # TODO(validate): remove after prod validation
|
|
1074
1058
|
logger.info(
|
|
1075
1059
|
"← Consumer resume cursor=%d received — resuming output (no re-run)",
|
|
1076
1060
|
resume_cursor,
|
|
@@ -1109,18 +1093,11 @@ class GatewayServicer:
|
|
|
1109
1093
|
first = False
|
|
1110
1094
|
continue
|
|
1111
1095
|
# Follow-up multi-turn input → task's input stream.
|
|
1112
|
-
|
|
1096
|
+
with contextlib.suppress(RedisError):
|
|
1113
1097
|
await self._redis_client.xadd(
|
|
1114
1098
|
f"task:{task_id}:input",
|
|
1115
1099
|
{"pb": upstream.data.SerializeToString()},
|
|
1116
1100
|
)
|
|
1117
|
-
except RedisError:
|
|
1118
|
-
logger.warning(
|
|
1119
|
-
"[VALIDATE R2] dropped follow-up input (redis unavailable): task_id=%s data=%s",
|
|
1120
|
-
task_id,
|
|
1121
|
-
str(upstream.data)[:512],
|
|
1122
|
-
extra=log_extra,
|
|
1123
|
-
) # TODO(validate): remove after prod validation
|
|
1124
1101
|
except grpc.aio.AioRpcError as exc:
|
|
1125
1102
|
code_name = exc.code().name
|
|
1126
1103
|
details = exc.details() or ""
|
{digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/m2m_call_registry.py
RENAMED
|
@@ -83,10 +83,7 @@ class M2MCallRegistry:
|
|
|
83
83
|
)
|
|
84
84
|
self._breakers[target_key] = breaker
|
|
85
85
|
if len(self._breakers) > 256: # noqa: PLR2004
|
|
86
|
-
|
|
87
|
-
logger.info(
|
|
88
|
-
"[VALIDATE D4] evicted LRU m2m breaker target=%s", evicted
|
|
89
|
-
) # TODO(validate): remove after prod validation
|
|
86
|
+
self._breakers.popitem(last=False)
|
|
90
87
|
return breaker
|
|
91
88
|
|
|
92
89
|
async def acquire_slot(self) -> None:
|
|
@@ -222,10 +219,6 @@ class M2MCallRegistry:
|
|
|
222
219
|
is_fatal = fatal_field is not None and fatal_field.bool_value
|
|
223
220
|
if is_fatal:
|
|
224
221
|
# M2: breaker outcome recorded only in call_module (was double-counted here).
|
|
225
|
-
logger.warning(
|
|
226
|
-
"[VALIDATE M2] fatal dial-back; breaker recorded only in call_module: task_id=%s",
|
|
227
|
-
task_id,
|
|
228
|
-
) # TODO(validate): remove after prod validation
|
|
229
222
|
return
|
|
230
223
|
finally:
|
|
231
224
|
with contextlib.suppress(asyncio.QueueFull):
|
{digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/module_server.py
RENAMED
|
@@ -197,9 +197,6 @@ class ModuleServer(BaseServer):
|
|
|
197
197
|
from digitalkin.grpc_servers.utils.grpc_client_wrapper import GrpcClientWrapper
|
|
198
198
|
|
|
199
199
|
# M9: close channels (resets ref_counts, clears stubs + breakers) instead of a bare cache clear.
|
|
200
|
-
logger.info(
|
|
201
|
-
"[VALIDATE M9] closing all cached gRPC channels on INVALIDATE_CHANNELS"
|
|
202
|
-
) # TODO(validate): remove after prod validation
|
|
203
200
|
await GrpcClientWrapper.close_all_cached_channels()
|
|
204
201
|
Bulkhead.clear_all()
|
|
205
202
|
|
|
@@ -331,7 +328,6 @@ class ModuleServer(BaseServer):
|
|
|
331
328
|
if self._gateway_redis_client is not None:
|
|
332
329
|
# M8: this server created the gateway's Redis client, so it closes it (owner closes;
|
|
333
330
|
# the gateway only borrows). Pools were leaked on every server stop.
|
|
334
|
-
logger.info("[VALIDATE M8] closing gateway Redis pools") # TODO(validate): remove after prod validation
|
|
335
331
|
try:
|
|
336
332
|
await self._gateway_redis_client.close()
|
|
337
333
|
except Exception:
|
{digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/module_servicer.py
RENAMED
|
@@ -21,6 +21,7 @@ from digitalkin.core.job_manager.base_job_manager import BaseJobManager
|
|
|
21
21
|
from digitalkin.core.job_manager.single_job_manager import SingleJobManager
|
|
22
22
|
from digitalkin.core.task_manager.redis.redis_signal import SharedRedisListener
|
|
23
23
|
from digitalkin.grpc_servers.exceptions import PermissionDeniedError, ServicerError
|
|
24
|
+
from digitalkin.grpc_servers.interceptors.request_ids import RequestContext
|
|
24
25
|
from digitalkin.logger import logger
|
|
25
26
|
from digitalkin.models.module.module import ModuleCodeModel
|
|
26
27
|
from digitalkin.models.module.setup_types import SetupModel
|
|
@@ -116,7 +117,6 @@ class ModuleServicer(module_service_pb2_grpc.ModuleServiceServicer, ArgParser):
|
|
|
116
117
|
except Exception:
|
|
117
118
|
logger.exception("Error closing GrpcUserProfile channel")
|
|
118
119
|
# M8: close the Redis connection pools (were leaked on every server stop).
|
|
119
|
-
logger.info("[VALIDATE M8] closing module servicer Redis pools") # TODO(validate): remove after prod validation
|
|
120
120
|
await self._redis_client.close()
|
|
121
121
|
|
|
122
122
|
if isinstance(self._registry_cache, GrpcRegistry):
|
|
@@ -272,9 +272,17 @@ class ModuleServicer(module_service_pb2_grpc.ModuleServiceServicer, ArgParser):
|
|
|
272
272
|
Raises:
|
|
273
273
|
PermissionDeniedError: If access to the setup is denied.
|
|
274
274
|
"""
|
|
275
|
-
|
|
275
|
+
allowed = await self.user_profile.check_resource_access(user_profile_pb2.RESOURCE_TYPE_SETUP, setup_id)
|
|
276
|
+
ids = RequestContext.current()
|
|
277
|
+
if not allowed:
|
|
278
|
+
logger.info(
|
|
279
|
+
"[VALIDATE AC1] setup access DENIED: setup_id=%s", setup_id, extra=ids
|
|
280
|
+
) # TODO(validate): remove after prod validation
|
|
276
281
|
msg = f"access denied to setup {setup_id}"
|
|
277
282
|
raise PermissionDeniedError(msg)
|
|
283
|
+
logger.info(
|
|
284
|
+
"[VALIDATE AC1] setup access granted: setup_id=%s", setup_id, extra=ids
|
|
285
|
+
) # TODO(validate): remove after prod validation
|
|
278
286
|
|
|
279
287
|
async def resolve_setup(self, setup_id: str, mission_id: str) -> SetupVersionData:
|
|
280
288
|
"""Return setup version data from cache or remote service.
|
|
@@ -362,6 +370,9 @@ class ModuleServicer(module_service_pb2_grpc.ModuleServiceServicer, ArgParser):
|
|
|
362
370
|
if not await self.user_profile.check_resource_access(
|
|
363
371
|
user_profile_pb2.RESOURCE_TYPE_SETUP, setup_version.setup_id
|
|
364
372
|
):
|
|
373
|
+
logger.info(
|
|
374
|
+
"[VALIDATE AC1] setup config access DENIED: setup_id=%s", setup_version.setup_id
|
|
375
|
+
) # TODO(validate): remove after prod validation
|
|
365
376
|
context.set_code(grpc.StatusCode.PERMISSION_DENIED)
|
|
366
377
|
context.set_details(f"access denied to setup {setup_version.setup_id}")
|
|
367
378
|
return lifecycle_pb2.ConfigSetupModuleResponse(success=False)
|
{digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/stream_registry.py
RENAMED
|
@@ -76,11 +76,6 @@ class StreamRegistry:
|
|
|
76
76
|
settings = get_gateway_settings()
|
|
77
77
|
if len(self._local_cache) >= settings.max_streams:
|
|
78
78
|
# H3: reject at capacity instead of evicting a live session.
|
|
79
|
-
logger.info(
|
|
80
|
-
"[VALIDATE H3] stream registry at capacity (%d), rejecting task_id=%s",
|
|
81
|
-
settings.max_streams,
|
|
82
|
-
session.task_id,
|
|
83
|
-
) # TODO(validate): remove after prod validation
|
|
84
79
|
return False
|
|
85
80
|
|
|
86
81
|
self._local_cache[session.task_id] = session
|
|
@@ -225,7 +225,7 @@ class GrpcClientWrapper:
|
|
|
225
225
|
cls._stub_cache.clear()
|
|
226
226
|
CircuitBreaker.clear_all()
|
|
227
227
|
|
|
228
|
-
async def exec_grpc_query( # noqa:
|
|
228
|
+
async def exec_grpc_query( # noqa: PLR0914
|
|
229
229
|
self,
|
|
230
230
|
query_endpoint: str,
|
|
231
231
|
request: Any,
|
|
@@ -256,11 +256,6 @@ class GrpcClientWrapper:
|
|
|
256
256
|
if rpc_method is None:
|
|
257
257
|
# M3: validate the method before claiming the half-open probe lock,
|
|
258
258
|
# so a missing method can't escape cb.check() and wedge the breaker.
|
|
259
|
-
logger.info(
|
|
260
|
-
"[VALIDATE M3] RPC method missing, raised before breaker probe: %s.%s",
|
|
261
|
-
self.service_name,
|
|
262
|
-
query_endpoint,
|
|
263
|
-
) # TODO(validate): remove after prod validation
|
|
264
259
|
msg = f"[gRPC-client:{self.service_name}] RPC method '{query_endpoint}' not found on stub"
|
|
265
260
|
raise ServerError(msg)
|
|
266
261
|
|
|
@@ -273,13 +268,6 @@ class GrpcClientWrapper:
|
|
|
273
268
|
|
|
274
269
|
grpc_settings = get_grpc_client_settings()
|
|
275
270
|
eff_timeout = timeout if timeout is not None else grpc_settings.timeout
|
|
276
|
-
if timeout is None:
|
|
277
|
-
logger.info(
|
|
278
|
-
"[VALIDATE H1] default gRPC deadline applied: %.1fs (%s.%s)",
|
|
279
|
-
eff_timeout,
|
|
280
|
-
self.service_name,
|
|
281
|
-
query_endpoint,
|
|
282
|
-
) # TODO(validate): remove after prod validation
|
|
283
271
|
max_retries = grpc_settings.max_retries
|
|
284
272
|
backoff_base_ms = grpc_settings.backoff_base_ms
|
|
285
273
|
backoff_delays = tuple(backoff_base_ms / 1000 * (2**i) for i in range(max_retries))
|
|
@@ -342,9 +330,4 @@ class GrpcClientWrapper:
|
|
|
342
330
|
raise ServerError(error_msg) from last_error
|
|
343
331
|
finally:
|
|
344
332
|
# Free a half-open probe the loop never resolved (e.g. CancelledError mid-call or backoff).
|
|
345
|
-
|
|
346
|
-
logger.info(
|
|
347
|
-
"[VALIDATE R1] released abandoned circuit probe: %s.%s",
|
|
348
|
-
self.service_name,
|
|
349
|
-
query_endpoint,
|
|
350
|
-
) # TODO(validate): remove after prod validation
|
|
333
|
+
cb.release_probe()
|
|
@@ -197,9 +197,6 @@ class LoggerFactory:
|
|
|
197
197
|
return
|
|
198
198
|
if any(isinstance(h, RotatingFileHandler) for h in logger.handlers):
|
|
199
199
|
# Low: idempotent — repeated setup_logger() calls must not stack handlers.
|
|
200
|
-
logger.debug(
|
|
201
|
-
"[VALIDATE Low-loghandler] file handler already attached, skipping"
|
|
202
|
-
) # TODO(validate): remove after prod validation
|
|
203
200
|
return
|
|
204
201
|
|
|
205
202
|
log_file = settings.file or os.path.join(log_dir, f"{logger.name}.log")
|
|
@@ -30,7 +30,6 @@ from ag_ui.core.events import ToolCallEndEvent as AgUiToolCallEndEvent
|
|
|
30
30
|
from ag_ui.core.events import ToolCallResultEvent as AgUiToolCallResultEvent
|
|
31
31
|
from ag_ui.core.events import ToolCallStartEvent as AgUiToolCallStartEvent
|
|
32
32
|
|
|
33
|
-
from digitalkin.logger import logger
|
|
34
33
|
from digitalkin.models.events import (
|
|
35
34
|
AgentRunEvent,
|
|
36
35
|
BaseAgentRunEvent,
|
|
@@ -408,9 +407,6 @@ class AgUiMixin:
|
|
|
408
407
|
event: CustomEvent,
|
|
409
408
|
) -> None:
|
|
410
409
|
"""Handle custom event - emit AG-UI CustomEvent."""
|
|
411
|
-
logger.info(
|
|
412
|
-
"[VALIDATE M15] CustomEvent dispatched via AG-UI: name=%s", event.name
|
|
413
|
-
) # TODO(validate): remove after prod validation
|
|
414
410
|
from ag_ui.core.events import CustomEvent as AgUiCustomEvent # pylint: disable=C0415
|
|
415
411
|
|
|
416
412
|
from digitalkin.models.module.ag_ui import AgUiCustomEventOutput # pylint: disable=C0415
|
{digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/tool_reference.py
RENAMED
|
@@ -134,7 +134,7 @@ class ToolReference(BaseModel):
|
|
|
134
134
|
Every failure path logs a ``WARNING`` with a ``reason=...`` field
|
|
135
135
|
(``setup_not_found``, ``module_not_discovered``, ``schema_fetch_failed``)
|
|
136
136
|
so callers don't need to re-derive the cause. Successful resolutions
|
|
137
|
-
emit ``[
|
|
137
|
+
emit ``[perf] tool_resolve`` at DEBUG with input/output counts.
|
|
138
138
|
Post-filter results of zero functions emit a second ``WARNING`` naming
|
|
139
139
|
the structural cause (``module_exposes_no_triggers``,
|
|
140
140
|
``all_user_triggers_unknown``, or ``post_filter_empty``).
|
|
@@ -191,8 +191,8 @@ class ToolReference(BaseModel):
|
|
|
191
191
|
)
|
|
192
192
|
|
|
193
193
|
post_count = len(available & enabled_triggers) if enabled_triggers else len(tool_info.tools)
|
|
194
|
-
logger.
|
|
195
|
-
"[
|
|
194
|
+
logger.debug(
|
|
195
|
+
"[perf] tool_resolve: setup_id=%s slug=%s "
|
|
196
196
|
"user_triggers_enabled=%d user_triggers_total=%d "
|
|
197
197
|
"module_available=%d post_filter=%d",
|
|
198
198
|
entry.setup_id,
|