digitalkin 1.0.2.dev4__tar.gz → 1.0.2.dev5__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.2.dev4 → digitalkin-1.0.2.dev5}/PKG-INFO +1 -1
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/pyproject.toml +1 -1
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/__version__.py +1 -1
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/_base_server.py +11 -4
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/mixins/storage_mixin.py +3 -2
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/services/registry.py +5 -1
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/services/storage.py +23 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/storage/default_storage.py +28 -9
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/storage/grpc_storage.py +36 -19
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/storage/storage_strategy.py +107 -56
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin.egg-info/PKG-INFO +1 -1
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/LICENSE +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/README.md +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/base_server/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/bench_module/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/bench_module/echo_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/bench_module/models/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/bench_module/models/input.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/bench_module/models/output.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/bench_module/models/secret.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/bench_module/models/setup.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/bench_module/server.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/bench_module/triggers/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/bench_module/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/modules/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/redis_demo/client.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/redis_demo/echo_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/redis_demo/models/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/redis_demo/models/input.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/redis_demo/models/output.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/redis_demo/models/secret.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/redis_demo/models/setup.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/redis_demo/server.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/redis_demo/triggers/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/redis_demo/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/services/filesystem_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/examples/services/storage_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/setup.cfg +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/agno_adapter.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/agui_tools.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/hitl.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/models.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/module_toolkit.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/toolkits/base.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/toolkits/chat_history.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/toolkits/registry.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/toolkits/setup.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/toolkits/tool_loader.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/community/agno/toolkits/user_profile.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/profiling/step_timer.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/resilience/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/resilience/bulkhead.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/module_runner.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/gateway_servicer.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/m2m_call_registry.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/module_server.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/stream_session.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/logger.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/mixins/agui_mixin.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/mixins/file_history_mixin.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/core/redis.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/events/agent_events.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/module_context.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/services/services.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/gateway.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/grpc_client.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/log.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/profiling.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/queue.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/redis.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/registry.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/resilience.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/server/channel.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/server/grpc.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/server/server.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/server/servicer.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/task_manager.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/settings/utils/channel.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/utils/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/modules/_base_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/py.typed +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/communication/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/communication/grpc_communication.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/cost/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/filesystem/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/registry/default_registry.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/registry/grpc_registry.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/registry/registry_strategy.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/secret/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/secret/default_secret.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/secret/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/secret/grpc_secret.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/secret/secret_strategy.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/services_config.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/setup/default_setup.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/setup/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/setup/grpc_setup.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/setup/setup_strategy.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/storage/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/task_manager/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/user_profile/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/utils/development_mode_action.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/utils/exceptions.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin.egg-info/SOURCES.txt +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin.egg-info/requires.txt +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin.egg-info/top_level.txt +0 -0
- {digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/tests/test_exceptions.py +0 -0
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import abc
|
|
4
4
|
import asyncio
|
|
5
5
|
import os
|
|
6
|
+
import sys
|
|
6
7
|
|
|
7
8
|
from digitalkin.models.settings.profiling import get_profiling_settings
|
|
8
9
|
|
|
@@ -196,10 +197,16 @@ class BaseServer(abc.ABC):
|
|
|
196
197
|
try: # noqa: PLW0717
|
|
197
198
|
grpc_compression = get_server_settings().grpc.compression.to_grpc()
|
|
198
199
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
200
|
+
# sched_getaffinity is Linux-only; the sys.platform guard lets mypy skip
|
|
201
|
+
# it as unreachable on other platforms without a type: ignore.
|
|
202
|
+
if sys.platform == "linux":
|
|
203
|
+
try:
|
|
204
|
+
cpu_count = len(os.sched_getaffinity(0))
|
|
205
|
+
logger.info("vCPU count: %d", cpu_count)
|
|
206
|
+
except OSError:
|
|
207
|
+
cpu_count = os.cpu_count() or 1
|
|
208
|
+
logger.info("CPU count: %d", cpu_count)
|
|
209
|
+
else:
|
|
203
210
|
cpu_count = os.cpu_count() or 1
|
|
204
211
|
logger.info("CPU count: %d", cpu_count)
|
|
205
212
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from typing import Any, Literal
|
|
4
4
|
|
|
5
5
|
from digitalkin.models.module.module_context import ModuleContext
|
|
6
|
+
from digitalkin.models.services.storage import DataType
|
|
6
7
|
from digitalkin.services.storage.storage_strategy import StorageRecord
|
|
7
8
|
|
|
8
9
|
|
|
@@ -36,7 +37,7 @@ class StorageMixin:
|
|
|
36
37
|
Raises:
|
|
37
38
|
StorageServiceError: If storage operation fails
|
|
38
39
|
"""
|
|
39
|
-
return await context.storage.store(collection, record_id, data, data_type=data_type)
|
|
40
|
+
return await context.storage.store(collection, record_id, data, data_type=DataType[data_type])
|
|
40
41
|
|
|
41
42
|
@staticmethod
|
|
42
43
|
async def read_storage(context: ModuleContext, collection: str, record_id: str) -> StorageRecord | None:
|
|
@@ -101,4 +102,4 @@ class StorageMixin:
|
|
|
101
102
|
Raises:
|
|
102
103
|
StorageServiceError: If upsert operation fails
|
|
103
104
|
"""
|
|
104
|
-
return await context.storage.upsert(collection, record_id, data, data_type=data_type)
|
|
105
|
+
return await context.storage.upsert(collection, record_id, data, data_type=DataType[data_type])
|
|
@@ -18,7 +18,11 @@ class RegistryModuleStatus(str, Enum):
|
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
class RegistryModuleType(str, Enum):
|
|
21
|
-
"""Module type in the registry.
|
|
21
|
+
"""Module type in the registry.
|
|
22
|
+
|
|
23
|
+
Member names mirror the proto ``ModuleType`` enum (minus the ``MODULE_TYPE_``
|
|
24
|
+
prefix): they are looked up by name from the wire value, so they must match.
|
|
25
|
+
"""
|
|
22
26
|
|
|
23
27
|
UNSPECIFIED = "unspecified"
|
|
24
28
|
ARCHETYPE = "archetype"
|
|
@@ -51,3 +51,26 @@ class DataType(Enum):
|
|
|
51
51
|
VIEW = "VIEW"
|
|
52
52
|
LOGS = "LOGS"
|
|
53
53
|
OTHER = "OTHER"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class ContextStorage(Enum):
|
|
57
|
+
"""Enum defining the context of data in storage."""
|
|
58
|
+
|
|
59
|
+
UNSPECIFIED = "unspecified"
|
|
60
|
+
MISSIONS = "missions"
|
|
61
|
+
SETUP_VERSIONS = "setup_versions"
|
|
62
|
+
USERS = "users"
|
|
63
|
+
ORGANIZATIONS = "organizations"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class Visibility(Enum):
|
|
67
|
+
"""Read-access scope of a record, mirroring the storage proto by integer value.
|
|
68
|
+
|
|
69
|
+
Ownership (who may edit) stays keyed on the record context; this only governs
|
|
70
|
+
who may read. UNSPECIFIED lets the storage service apply its server-side default.
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
UNSPECIFIED = 0
|
|
74
|
+
PUBLIC = 1
|
|
75
|
+
PRIVATE = 2
|
|
76
|
+
INTERNAL = 3
|
{digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/storage/default_storage.py
RENAMED
|
@@ -9,7 +9,7 @@ from typing import Any
|
|
|
9
9
|
from pydantic import BaseModel
|
|
10
10
|
|
|
11
11
|
from digitalkin.logger import logger
|
|
12
|
-
from digitalkin.models.services.storage import DataType
|
|
12
|
+
from digitalkin.models.services.storage import DataType, Visibility
|
|
13
13
|
from digitalkin.services.storage.storage_strategy import (
|
|
14
14
|
StorageRecord,
|
|
15
15
|
StorageStrategy,
|
|
@@ -67,6 +67,7 @@ class DefaultStorage(StorageStrategy):
|
|
|
67
67
|
record_id=rd["record_id"],
|
|
68
68
|
data=data_model,
|
|
69
69
|
data_type=DataType[rd["data_type"]],
|
|
70
|
+
visibility=Visibility[rd["visibility"]] if rd.get("visibility") else Visibility.UNSPECIFIED,
|
|
70
71
|
creation_date=datetime.datetime.fromisoformat(rd["creation_date"])
|
|
71
72
|
if rd.get("creation_date")
|
|
72
73
|
else None,
|
|
@@ -97,6 +98,7 @@ class DefaultStorage(StorageStrategy):
|
|
|
97
98
|
"collection": record.collection,
|
|
98
99
|
"record_id": record.record_id,
|
|
99
100
|
"data_type": record.data_type.name,
|
|
101
|
+
"visibility": record.visibility.name,
|
|
100
102
|
"data": record.data.model_dump(),
|
|
101
103
|
"creation_date": record.creation_date.isoformat() if record.creation_date else None,
|
|
102
104
|
"update_date": record.update_date.isoformat() if record.update_date else None,
|
|
@@ -141,21 +143,29 @@ class DefaultStorage(StorageStrategy):
|
|
|
141
143
|
Args:
|
|
142
144
|
collection: The unique name to retrieve data for
|
|
143
145
|
record_id: The unique ID of the record
|
|
144
|
-
context:
|
|
146
|
+
context: Resolved owner context scoping the lookup.
|
|
145
147
|
|
|
146
148
|
Returns:
|
|
147
149
|
StorageRecord: The corresponding record
|
|
148
150
|
"""
|
|
149
151
|
return self.storage.get(self._key(context, collection, record_id))
|
|
150
152
|
|
|
151
|
-
async def _update(
|
|
153
|
+
async def _update(
|
|
154
|
+
self,
|
|
155
|
+
collection: str,
|
|
156
|
+
record_id: str,
|
|
157
|
+
data: BaseModel,
|
|
158
|
+
context: str,
|
|
159
|
+
visibility: Visibility = Visibility.UNSPECIFIED,
|
|
160
|
+
) -> StorageRecord | None:
|
|
152
161
|
"""Update a record in the database scoped to a specific context.
|
|
153
162
|
|
|
154
163
|
Args:
|
|
155
164
|
collection: The unique name to retrieve data for
|
|
156
165
|
record_id: The unique ID of the record
|
|
157
166
|
data: The data to modify
|
|
158
|
-
context:
|
|
167
|
+
context: Resolved owner context scoping the update.
|
|
168
|
+
visibility: New read-access scope; UNSPECIFIED leaves it unchanged.
|
|
159
169
|
|
|
160
170
|
Returns:
|
|
161
171
|
StorageRecord: The modified record
|
|
@@ -165,6 +175,8 @@ class DefaultStorage(StorageStrategy):
|
|
|
165
175
|
if not rec:
|
|
166
176
|
return None
|
|
167
177
|
rec.data = data
|
|
178
|
+
if visibility is not Visibility.UNSPECIFIED:
|
|
179
|
+
rec.visibility = visibility
|
|
168
180
|
rec.update_date = datetime.datetime.now(datetime.timezone.utc)
|
|
169
181
|
self._save_to_file()
|
|
170
182
|
logger.debug("Modified %s", key)
|
|
@@ -176,7 +188,7 @@ class DefaultStorage(StorageStrategy):
|
|
|
176
188
|
Args:
|
|
177
189
|
collection: The unique name to retrieve data for
|
|
178
190
|
record_id: The unique ID of the record
|
|
179
|
-
context:
|
|
191
|
+
context: Resolved owner context scoping the deletion.
|
|
180
192
|
|
|
181
193
|
Returns:
|
|
182
194
|
bool: True if the record was removed, False otherwise
|
|
@@ -189,25 +201,32 @@ class DefaultStorage(StorageStrategy):
|
|
|
189
201
|
logger.debug("Removed %s", key)
|
|
190
202
|
return True
|
|
191
203
|
|
|
192
|
-
async def _list(
|
|
204
|
+
async def _list(
|
|
205
|
+
self, collection: str, context: str, visibilities: list[Visibility] | None = None
|
|
206
|
+
) -> list[StorageRecord]:
|
|
193
207
|
"""List records in a collection scoped to a specific context.
|
|
194
208
|
|
|
195
209
|
Args:
|
|
196
210
|
collection: The unique name to retrieve data for
|
|
197
|
-
context:
|
|
211
|
+
context: Resolved owner context scoping the listing.
|
|
212
|
+
visibilities: Optional read-access scopes to filter by (None = no filter).
|
|
198
213
|
|
|
199
214
|
Returns:
|
|
200
215
|
A list of storage records
|
|
201
216
|
"""
|
|
202
217
|
prefix = f"{context}|{collection}:"
|
|
203
|
-
|
|
218
|
+
records = [r for k, r in self.storage.items() if k.startswith(prefix)]
|
|
219
|
+
if visibilities:
|
|
220
|
+
allowed = set(visibilities)
|
|
221
|
+
records = [r for r in records if r.visibility in allowed]
|
|
222
|
+
return records
|
|
204
223
|
|
|
205
224
|
async def _remove_collection(self, collection: str, context: str) -> bool:
|
|
206
225
|
"""Wipe a collection scoped to a specific context.
|
|
207
226
|
|
|
208
227
|
Args:
|
|
209
228
|
collection: The unique name to retrieve data for
|
|
210
|
-
context:
|
|
229
|
+
context: Resolved owner context scoping the wipe.
|
|
211
230
|
|
|
212
231
|
Returns:
|
|
213
232
|
bool: True if the collection was removed, False otherwise
|
{digitalkin-1.0.2.dev4 → digitalkin-1.0.2.dev5}/src/digitalkin/services/storage/grpc_storage.py
RENAMED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""This module implements the default storage strategy."""
|
|
2
2
|
|
|
3
|
+
from typing import cast
|
|
4
|
+
|
|
3
5
|
from agentic_mesh_protocol.storage.v1 import data_pb2, storage_service_pb2_grpc
|
|
4
6
|
from google.protobuf.struct_pb2 import Struct
|
|
5
7
|
from pydantic import BaseModel
|
|
@@ -8,7 +10,7 @@ from digitalkin.grpc_servers.exceptions import CircuitOpenError, PermissionDenie
|
|
|
8
10
|
from digitalkin.grpc_servers.utils.grpc_client_wrapper import GrpcClientWrapper
|
|
9
11
|
from digitalkin.logger import logger
|
|
10
12
|
from digitalkin.models.grpc_servers.models import ClientConfig
|
|
11
|
-
from digitalkin.models.services.storage import DataType
|
|
13
|
+
from digitalkin.models.services.storage import DataType, Visibility
|
|
12
14
|
from digitalkin.services.storage.exceptions import StorageServiceError
|
|
13
15
|
from digitalkin.services.storage.storage_strategy import (
|
|
14
16
|
StorageRecord,
|
|
@@ -74,6 +76,7 @@ class GrpcStorage(StorageStrategy, GrpcClientWrapper):
|
|
|
74
76
|
coll = proto.collection
|
|
75
77
|
rid = proto.record_id
|
|
76
78
|
dtype = DataType[data_pb2.DataType.Name(proto.data_type)]
|
|
79
|
+
visibility = Visibility(proto.visibility)
|
|
77
80
|
|
|
78
81
|
# Selective deserialization: only the nested Struct payload
|
|
79
82
|
payload = ProtoUtils.proto_to_dict(proto.data) if proto.HasField("data") else {}
|
|
@@ -89,6 +92,7 @@ class GrpcStorage(StorageStrategy, GrpcClientWrapper):
|
|
|
89
92
|
record_id=rid,
|
|
90
93
|
data=validated,
|
|
91
94
|
data_type=dtype,
|
|
95
|
+
visibility=visibility,
|
|
92
96
|
creation_date=creation_date,
|
|
93
97
|
update_date=update_date,
|
|
94
98
|
)
|
|
@@ -127,16 +131,17 @@ class GrpcStorage(StorageStrategy, GrpcClientWrapper):
|
|
|
127
131
|
StorageServiceError: If there is an error while storing the record
|
|
128
132
|
"""
|
|
129
133
|
logger.debug("debug:_store collection=%s id=%s", record.collection, record.record_id)
|
|
134
|
+
data_struct = Struct()
|
|
135
|
+
data_struct.update(record.data.model_dump())
|
|
136
|
+
req = data_pb2.StoreRecordRequest(
|
|
137
|
+
data=data_struct,
|
|
138
|
+
context=self._context_enum(record.context),
|
|
139
|
+
collection=record.collection,
|
|
140
|
+
record_id=record.record_id,
|
|
141
|
+
data_type=record.data_type.name,
|
|
142
|
+
visibility=cast("data_pb2.Visibility", record.visibility.value),
|
|
143
|
+
)
|
|
130
144
|
try:
|
|
131
|
-
data_struct = Struct()
|
|
132
|
-
data_struct.update(record.data.model_dump())
|
|
133
|
-
req = data_pb2.StoreRecordRequest(
|
|
134
|
-
data=data_struct,
|
|
135
|
-
context=self._context_enum(record.context),
|
|
136
|
-
collection=record.collection,
|
|
137
|
-
record_id=record.record_id,
|
|
138
|
-
data_type=record.data_type.name,
|
|
139
|
-
)
|
|
140
145
|
resp = await self.exec_grpc_query("StoreRecord", req)
|
|
141
146
|
return self._build_record_from_proto(resp.stored_data)
|
|
142
147
|
except PermissionDeniedError:
|
|
@@ -185,12 +190,19 @@ class GrpcStorage(StorageStrategy, GrpcClientWrapper):
|
|
|
185
190
|
logger.warning("Invalid record data for %s:%s in ReadRecord", collection, record_id, exc_info=True)
|
|
186
191
|
return None
|
|
187
192
|
|
|
193
|
+
try:
|
|
194
|
+
return self._build_record_from_proto(resp.stored_data)
|
|
195
|
+
except Exception:
|
|
196
|
+
logger.warning("Invalid record data for %s:%s in ReadRecord", collection, record_id, exc_info=True)
|
|
197
|
+
return None
|
|
198
|
+
|
|
188
199
|
async def _update(
|
|
189
200
|
self,
|
|
190
201
|
collection: str,
|
|
191
202
|
record_id: str,
|
|
192
203
|
data: BaseModel,
|
|
193
204
|
context: str,
|
|
205
|
+
visibility: Visibility = Visibility.UNSPECIFIED,
|
|
194
206
|
) -> StorageRecord | None:
|
|
195
207
|
"""Overwrite a document via gRPC scoped to a specific context.
|
|
196
208
|
|
|
@@ -201,15 +213,16 @@ class GrpcStorage(StorageStrategy, GrpcClientWrapper):
|
|
|
201
213
|
PermissionDeniedError: If the service rejects the call with PERMISSION_DENIED.
|
|
202
214
|
"""
|
|
203
215
|
logger.debug("debug:_update context=%s collection=%s id=%s", context, collection, record_id)
|
|
216
|
+
struct = Struct()
|
|
217
|
+
struct.update(data.model_dump())
|
|
218
|
+
req = data_pb2.UpdateRecordRequest(
|
|
219
|
+
data=struct,
|
|
220
|
+
context=self._context_enum(context),
|
|
221
|
+
collection=collection,
|
|
222
|
+
record_id=record_id,
|
|
223
|
+
visibility=cast("data_pb2.Visibility", visibility.value),
|
|
224
|
+
)
|
|
204
225
|
try:
|
|
205
|
-
struct = Struct()
|
|
206
|
-
struct.update(data.model_dump())
|
|
207
|
-
req = data_pb2.UpdateRecordRequest(
|
|
208
|
-
data=struct,
|
|
209
|
-
context=self._context_enum(context),
|
|
210
|
-
collection=collection,
|
|
211
|
-
record_id=record_id,
|
|
212
|
-
)
|
|
213
226
|
resp = await self.exec_grpc_query("UpdateRecord", req)
|
|
214
227
|
return self._build_record_from_proto(resp.stored_data)
|
|
215
228
|
except PermissionDeniedError:
|
|
@@ -252,7 +265,9 @@ class GrpcStorage(StorageStrategy, GrpcClientWrapper):
|
|
|
252
265
|
return False
|
|
253
266
|
return True
|
|
254
267
|
|
|
255
|
-
async def _list(
|
|
268
|
+
async def _list(
|
|
269
|
+
self, collection: str, context: str, visibilities: list[Visibility] | None = None
|
|
270
|
+
) -> list[StorageRecord]:
|
|
256
271
|
"""List all documents in a collection via gRPC scoped to a specific context.
|
|
257
272
|
|
|
258
273
|
Returns:
|
|
@@ -267,6 +282,8 @@ class GrpcStorage(StorageStrategy, GrpcClientWrapper):
|
|
|
267
282
|
context=self._context_enum(context),
|
|
268
283
|
collection=collection,
|
|
269
284
|
)
|
|
285
|
+
if visibilities:
|
|
286
|
+
req.visibilities.extend(cast("data_pb2.Visibility", v.value) for v in visibilities)
|
|
270
287
|
resp = await self.exec_grpc_query("ListRecords", req)
|
|
271
288
|
except PermissionDeniedError:
|
|
272
289
|
# TODO(validate): remove after prod validation
|