digitalkin 1.0.4.dev5__tar.gz → 1.0.4.dev7__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.4.dev5 → digitalkin-1.0.4.dev7}/PKG-INFO +2 -2
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/services/filesystem_module.py +7 -6
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/pyproject.toml +45 -45
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/__version__.py +1 -1
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/action.py +1 -1
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/file_history_mixin.py +4 -3
- digitalkin-1.0.4.dev7/src/digitalkin/mixins/filesystem_mixin.py +220 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/__init__.py +6 -0
- digitalkin-1.0.4.dev7/src/digitalkin/models/module/knowledge_files.py +87 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/services/__init__.py +4 -0
- digitalkin-1.0.4.dev7/src/digitalkin/models/services/filesystem.py +127 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/services/storage.py +3 -9
- digitalkin-1.0.4.dev7/src/digitalkin/services/filesystem/__init__.py +19 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/filesystem/default_filesystem.py +29 -22
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/filesystem/filesystem_strategy.py +49 -49
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/filesystem/grpc_filesystem.py +18 -40
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/development_mode_action.py +2 -2
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin.egg-info/PKG-INFO +2 -2
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin.egg-info/SOURCES.txt +2 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin.egg-info/requires.txt +1 -1
- digitalkin-1.0.4.dev5/src/digitalkin/mixins/filesystem_mixin.py +0 -46
- digitalkin-1.0.4.dev5/src/digitalkin/services/filesystem/__init__.py +0 -7
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/LICENSE +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/README.md +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/echo_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/models/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/models/input.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/models/output.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/models/secret.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/models/setup.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/server.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/triggers/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/client.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/echo_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/models/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/models/input.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/models/output.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/models/secret.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/models/setup.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/server.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/triggers/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/services/storage_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/setup.cfg +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/agno_adapter.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/agui_tools.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/hitl.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/models.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/module_toolkit.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/base.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/chat_history.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/base.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/services/action.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/user_profile.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/profiling/step_timer.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/resilience/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/resilience/bulkhead.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/module_runner.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/_base_server.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/gateway_servicer.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/m2m_call_registry.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/module_server.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/stream_session.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/logger.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/agui_mixin.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/core/redis.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/events/agent_events.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/loaded_tools.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/module_context.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/services/registry.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/services/services.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/certificate.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/client/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/client/channel.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/client/circuit_breaker.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/client/client.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/client/grpc.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/gateway.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/log.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/profiling.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/queue.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/redis.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/registry.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/resilience.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/server/channel.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/server/grpc.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/server/server.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/server/servicer.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/task_manager.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/utils/channel.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/utils/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/_base_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/py.typed +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/communication/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/communication/grpc_communication.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/cost/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/filesystem/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/default_registry.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/grpc_registry.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/registry_strategy.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/secret/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/secret/default_secret.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/secret/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/secret/grpc_secret.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/secret/secret_strategy.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/services_config.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/setup/default_setup.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/setup/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/setup/grpc_setup.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/setup/setup_strategy.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/storage/default_storage.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/storage/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/storage/grpc_storage.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/storage/storage_strategy.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/task_manager/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/user_profile/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/env_manager.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/env_template.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/exceptions.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/json_structure.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/setup_content_validator.py +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin.egg-info/top_level.txt +0 -0
- {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/tests/test_exceptions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digitalkin
|
|
3
|
-
Version: 1.0.4.
|
|
3
|
+
Version: 1.0.4.dev7
|
|
4
4
|
Summary: SDK to build kin used in DigitalKin
|
|
5
5
|
Author-email: "DigitalKin.ai" <contact@digitalkin.ai>
|
|
6
6
|
License: Attribution-NonCommercial-ShareAlike 4.0 International
|
|
@@ -453,7 +453,7 @@ Requires-Python: >=3.10
|
|
|
453
453
|
Description-Content-Type: text/markdown
|
|
454
454
|
License-File: LICENSE
|
|
455
455
|
Requires-Dist: ag-ui-protocol==0.1.21.dev1787220377
|
|
456
|
-
Requires-Dist: agentic-mesh-protocol==1.0.2
|
|
456
|
+
Requires-Dist: agentic-mesh-protocol==1.0.2
|
|
457
457
|
Requires-Dist: agno<3,>=2.8.0
|
|
458
458
|
Requires-Dist: anyio>=4.13.0
|
|
459
459
|
Requires-Dist: grpcio-health-checking==1.82.1
|
|
@@ -10,7 +10,8 @@ from pydantic import BaseModel, Field
|
|
|
10
10
|
from digitalkin.logger import logger
|
|
11
11
|
from digitalkin.models.module import ModuleStatus
|
|
12
12
|
from digitalkin.modules.archetype_module import ArchetypeModule
|
|
13
|
-
from digitalkin.services.filesystem
|
|
13
|
+
from digitalkin.models.services.filesystem import FileType
|
|
14
|
+
from digitalkin.services.filesystem import FileFilter, UploadFileData
|
|
14
15
|
from digitalkin.services.services_config import ServicesConfig
|
|
15
16
|
from digitalkin.services.services_models import ServicesMode
|
|
16
17
|
|
|
@@ -118,9 +119,9 @@ class ExampleModule(ArchetypeModule[ExampleInput, ExampleOutput, ExampleSetup, E
|
|
|
118
119
|
file = UploadFileData(
|
|
119
120
|
content=b"%s\n%s" % (processed_message.encode(), str(processed_number).encode()),
|
|
120
121
|
name="example_output.txt",
|
|
121
|
-
|
|
122
|
+
type=FileType.DOCUMENT,
|
|
122
123
|
content_type="text/plain",
|
|
123
|
-
metadata={"
|
|
124
|
+
metadata={"sdk_created": True},
|
|
124
125
|
replace_if_exists=True,
|
|
125
126
|
)
|
|
126
127
|
|
|
@@ -176,10 +177,10 @@ async def test_module() -> None:
|
|
|
176
177
|
# Check the storage
|
|
177
178
|
if module.status == ModuleStatus.STOPPED:
|
|
178
179
|
files, _nb_results = await module.filesystem.get_files(
|
|
179
|
-
filters=FileFilter(
|
|
180
|
+
filters=FileFilter(names=["example_output.txt"]),
|
|
180
181
|
)
|
|
181
182
|
for file in files:
|
|
182
|
-
await module.filesystem.update_file(file.id,
|
|
183
|
+
await module.filesystem.update_file(file.id, type=FileType.OTHER)
|
|
183
184
|
# module.filesystem.delete_files(filters=FileFilter(name="example_output.txt", context="test-mission-123"), permanent=True)
|
|
184
185
|
|
|
185
186
|
logger.info("Retrieved file: %s with ID: %s", file.name, file.id)
|
|
@@ -188,7 +189,7 @@ async def test_module() -> None:
|
|
|
188
189
|
if file_record:
|
|
189
190
|
logger.info("File ID: %s", file_record.id)
|
|
190
191
|
logger.info("File name: %s", file_record.name)
|
|
191
|
-
logger.info("File type: %s", file_record.
|
|
192
|
+
logger.info("File type: %s", file_record.type)
|
|
192
193
|
logger.info("File status: %s", file_record.status)
|
|
193
194
|
logger.info("File content: %s", file_record.content.decode())
|
|
194
195
|
except Exception:
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
# which is how a nested run's output is attributed to its author. Pinned exactly
|
|
32
32
|
# because it is a dated prerelease; move to >=0.1.21 once that ships stable.
|
|
33
33
|
"ag-ui-protocol==0.1.21.dev1787220377",
|
|
34
|
-
"agentic-mesh-protocol==1.0.2
|
|
34
|
+
"agentic-mesh-protocol==1.0.2",
|
|
35
35
|
"agno>=2.8.0,<3",
|
|
36
36
|
"anyio>=4.13.0",
|
|
37
37
|
"grpcio-health-checking==1.82.1",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"pydantic>=2.12.4",
|
|
42
42
|
"redis[hiredis]>=7.4.0,<9",
|
|
43
43
|
]
|
|
44
|
-
version = "1.0.4.
|
|
44
|
+
version = "1.0.4.dev7"
|
|
45
45
|
|
|
46
46
|
[project.optional-dependencies]
|
|
47
47
|
agno = [ "agno>=2.6" ]
|
|
@@ -208,15 +208,15 @@ version = "1.0.4.dev5"
|
|
|
208
208
|
]
|
|
209
209
|
|
|
210
210
|
ignore = [
|
|
211
|
-
"
|
|
212
|
-
"
|
|
213
|
-
"
|
|
214
|
-
"
|
|
215
|
-
"
|
|
216
|
-
"
|
|
217
|
-
"
|
|
218
|
-
"
|
|
219
|
-
"
|
|
211
|
+
"any-type", # Allow typing.Any — gRPC stubs, callbacks, and dynamic APIs require it
|
|
212
|
+
"missing-trailing-comma", # Disable because of formatter incompatibility
|
|
213
|
+
"docstring-extraneous-exception", # Allow extraneous-exception in docstring
|
|
214
|
+
"unused-import", # Allow unused imports — used for availability checks
|
|
215
|
+
"invalid-function-name", # Allow PascalCase methods — gRPC servicer convention
|
|
216
|
+
"import-outside-top-level", # Allow lazy imports — needed to break circular dependencies
|
|
217
|
+
"bad-dunder-method-name", # Allow __get_pydantic_core_schema__ — Pydantic dunder hook
|
|
218
|
+
"hardcoded-password-string", # Hardcoded-password
|
|
219
|
+
"suspicious-pickle-import", # Allow pickle import
|
|
220
220
|
]
|
|
221
221
|
|
|
222
222
|
fixable = [ "ALL" ]
|
|
@@ -226,40 +226,40 @@ version = "1.0.4.dev5"
|
|
|
226
226
|
|
|
227
227
|
[tool.ruff.lint.per-file-ignores]
|
|
228
228
|
"tests/**/*.py" = [
|
|
229
|
-
"
|
|
230
|
-
"
|
|
231
|
-
"
|
|
232
|
-
"
|
|
233
|
-
"
|
|
234
|
-
"
|
|
235
|
-
"
|
|
236
|
-
"
|
|
237
|
-
"
|
|
238
|
-
"
|
|
239
|
-
"
|
|
240
|
-
"
|
|
241
|
-
"
|
|
242
|
-
"
|
|
243
|
-
"
|
|
244
|
-
"
|
|
245
|
-
"
|
|
246
|
-
"
|
|
247
|
-
"
|
|
248
|
-
"
|
|
249
|
-
"
|
|
250
|
-
"
|
|
251
|
-
"
|
|
252
|
-
"
|
|
253
|
-
"
|
|
254
|
-
"
|
|
255
|
-
"
|
|
256
|
-
"
|
|
257
|
-
"
|
|
258
|
-
"
|
|
259
|
-
"
|
|
260
|
-
"
|
|
261
|
-
"
|
|
262
|
-
"
|
|
229
|
+
"missing-type-function-argument",
|
|
230
|
+
"missing-type-args",
|
|
231
|
+
"missing-type-kwargs",
|
|
232
|
+
"missing-return-type-undocumented-public-function",
|
|
233
|
+
"any-type",
|
|
234
|
+
"unused-function-argument",
|
|
235
|
+
"unused-method-argument",
|
|
236
|
+
"complex-structure",
|
|
237
|
+
"undocumented-public-module",
|
|
238
|
+
"undocumented-public-class",
|
|
239
|
+
"undocumented-public-method",
|
|
240
|
+
"undocumented-public-function",
|
|
241
|
+
"undocumented-public-init",
|
|
242
|
+
"undocumented-param",
|
|
243
|
+
"docstring-missing-returns",
|
|
244
|
+
"docstring-missing-exception",
|
|
245
|
+
"line-too-long",
|
|
246
|
+
"commented-out-code",
|
|
247
|
+
"boolean-type-hint-positional-argument",
|
|
248
|
+
"boolean-default-value-positional-argument",
|
|
249
|
+
"logging-f-string",
|
|
250
|
+
"invalid-function-name",
|
|
251
|
+
"try-except-in-loop",
|
|
252
|
+
"import-private-name",
|
|
253
|
+
"too-many-return-statements",
|
|
254
|
+
"too-many-branches",
|
|
255
|
+
"too-many-locals",
|
|
256
|
+
"too-many-statements",
|
|
257
|
+
"too-many-nested-blocks",
|
|
258
|
+
"magic-value-comparison",
|
|
259
|
+
"no-self-use",
|
|
260
|
+
"assert",
|
|
261
|
+
"private-member-access",
|
|
262
|
+
"raise-vanilla-class",
|
|
263
263
|
]
|
|
264
264
|
|
|
265
265
|
[tool.ruff.lint.pylint]
|
|
@@ -147,7 +147,7 @@ class SearchAction(RegistryAction):
|
|
|
147
147
|
"tags": setup.tags,
|
|
148
148
|
"visibility": setup.visibility.value if setup.visibility else None,
|
|
149
149
|
"status": setup.status.value if setup.status else None,
|
|
150
|
-
"
|
|
150
|
+
"description": (setup.documentation or "")[: self._DOC_PREVIEW_CHARS],
|
|
151
151
|
}
|
|
152
152
|
# Only service setups carry a map. Omitting the key rather than rendering an empty
|
|
153
153
|
# one keeps the feature out of the tools and kins surfaces entirely.
|
|
@@ -10,7 +10,8 @@ from digitalkin.logger import logger
|
|
|
10
10
|
from digitalkin.mixins.logger_mixin import LoggerMixin
|
|
11
11
|
from digitalkin.mixins.storage_mixin import StorageMixin
|
|
12
12
|
from digitalkin.models.module.module_context import ModuleContext
|
|
13
|
-
from digitalkin.models.services.
|
|
13
|
+
from digitalkin.models.services.filesystem import FileMetadata
|
|
14
|
+
from digitalkin.models.services.storage import FileHistory
|
|
14
15
|
from digitalkin.models.settings.module import get_module_settings
|
|
15
16
|
|
|
16
17
|
|
|
@@ -84,7 +85,7 @@ class FileHistoryMixin(StorageMixin, LoggerMixin):
|
|
|
84
85
|
self._fh_cache[history_key] = history
|
|
85
86
|
return history
|
|
86
87
|
|
|
87
|
-
async def append_files_history(self, context: ModuleContext, files: list[
|
|
88
|
+
async def append_files_history(self, context: ModuleContext, files: list[FileMetadata]) -> None:
|
|
88
89
|
"""Append files to file history.
|
|
89
90
|
|
|
90
91
|
Files are added to the in-memory cache immediately. A storage
|
|
@@ -93,7 +94,7 @@ class FileHistoryMixin(StorageMixin, LoggerMixin):
|
|
|
93
94
|
|
|
94
95
|
Args:
|
|
95
96
|
context: Module context containing storage strategy.
|
|
96
|
-
files:
|
|
97
|
+
files: Files to append.
|
|
97
98
|
"""
|
|
98
99
|
history_key = self._get_fh_history_key(context)
|
|
99
100
|
file_history = await self.load_file_history(context)
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"""Filesystem Mixin to ease filesystem use."""
|
|
2
|
+
|
|
3
|
+
from digitalkin.logger import logger
|
|
4
|
+
from digitalkin.models.module.module_context import ModuleContext
|
|
5
|
+
from digitalkin.models.services.filesystem import FileMetadata, FileType, FileUploadMetadata
|
|
6
|
+
from digitalkin.models.services.services import Context
|
|
7
|
+
from digitalkin.models.services.storage import Visibility
|
|
8
|
+
from digitalkin.services.filesystem.filesystem_strategy import FileFilter, FilesystemRecord, UploadFileData
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class FilesystemMixin:
|
|
12
|
+
"""Mixin providing filesystem operations through the filesystem strategy.
|
|
13
|
+
|
|
14
|
+
This mixin wraps filesystem strategy calls to provide a cleaner API
|
|
15
|
+
for file operations in trigger handlers.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
@staticmethod
|
|
19
|
+
async def upload_files(
|
|
20
|
+
context: ModuleContext, files: list[UploadFileData]
|
|
21
|
+
) -> tuple[list[FilesystemRecord], int, int]:
|
|
22
|
+
"""Upload files using the filesystem strategy.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
context: Module context containing the filesystem strategy
|
|
26
|
+
files: List of files to upload
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
Tuple of (all_files, succeeded_files, failed_files)
|
|
30
|
+
|
|
31
|
+
Raises:
|
|
32
|
+
FilesystemServiceError: If upload operation fails
|
|
33
|
+
"""
|
|
34
|
+
return await context.filesystem.upload_files(files)
|
|
35
|
+
|
|
36
|
+
@staticmethod
|
|
37
|
+
async def upload_file(
|
|
38
|
+
context: ModuleContext,
|
|
39
|
+
name: str,
|
|
40
|
+
content: bytes,
|
|
41
|
+
content_type: str,
|
|
42
|
+
type: FileType | None = None, # Matches the canonical field name # ruff: ignore[builtin-argument-shadowing]
|
|
43
|
+
visibility: Visibility = Visibility.UNSPECIFIED,
|
|
44
|
+
*,
|
|
45
|
+
sdk_created: bool = False,
|
|
46
|
+
) -> FileMetadata | None:
|
|
47
|
+
"""Upload a single file, inferring its type from the MIME type when not given.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
context: Module context containing the filesystem strategy
|
|
51
|
+
name: The name of the file
|
|
52
|
+
content: The content of the file
|
|
53
|
+
content_type: The MIME type of the file
|
|
54
|
+
type: The category of the file; inferred from `content_type` when omitted
|
|
55
|
+
visibility: Read-access scope; UNSPECIFIED lets the service default it
|
|
56
|
+
sdk_created: Whether this file is a module deliverable
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
The uploaded file, or None when the upload failed.
|
|
60
|
+
"""
|
|
61
|
+
try:
|
|
62
|
+
records, _uploaded, failed = await context.filesystem.upload_files([
|
|
63
|
+
UploadFileData(
|
|
64
|
+
content=content,
|
|
65
|
+
name=name,
|
|
66
|
+
type=type or FileType.from_content_type(content_type),
|
|
67
|
+
content_type=content_type,
|
|
68
|
+
metadata=FileUploadMetadata(sdk_created=sdk_created, filename=name),
|
|
69
|
+
replace_if_exists=True,
|
|
70
|
+
visibility=visibility,
|
|
71
|
+
)
|
|
72
|
+
])
|
|
73
|
+
except Exception:
|
|
74
|
+
logger.exception("Failed to upload file '%s' (%s)", name, content_type, extra=context.session.current_ids())
|
|
75
|
+
return None
|
|
76
|
+
if failed or not records:
|
|
77
|
+
logger.error("Upload rejected for file '%s' (%s)", name, content_type, extra=context.session.current_ids())
|
|
78
|
+
return None
|
|
79
|
+
return records[0]
|
|
80
|
+
|
|
81
|
+
@staticmethod
|
|
82
|
+
async def get_file(
|
|
83
|
+
context: ModuleContext,
|
|
84
|
+
file_id: str,
|
|
85
|
+
file_context: Context = Context.MISSIONS,
|
|
86
|
+
*,
|
|
87
|
+
include_content: bool = True,
|
|
88
|
+
) -> FilesystemRecord:
|
|
89
|
+
"""Retrieve a file by ID, with its content by default.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
context: Module context containing the filesystem strategy
|
|
93
|
+
file_id: Unique identifier for the file
|
|
94
|
+
file_context: The owner context to look the file up in
|
|
95
|
+
include_content: Whether to include file content in the response
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
File object with metadata and optionally content
|
|
99
|
+
|
|
100
|
+
Raises:
|
|
101
|
+
FilesystemServiceError: If file retrieval fails
|
|
102
|
+
"""
|
|
103
|
+
return await context.filesystem.get_file(file_id, context=file_context, include_content=include_content)
|
|
104
|
+
|
|
105
|
+
@staticmethod
|
|
106
|
+
async def get_files(
|
|
107
|
+
context: ModuleContext,
|
|
108
|
+
filters: FileFilter,
|
|
109
|
+
*,
|
|
110
|
+
include_content: bool = False,
|
|
111
|
+
) -> list[FilesystemRecord]:
|
|
112
|
+
"""List files matching the given filters.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
context: Module context containing the filesystem strategy
|
|
116
|
+
filters: Filter criteria for the files
|
|
117
|
+
include_content: Whether to include file content in the response
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
Matching file records, empty when the lookup fails.
|
|
121
|
+
"""
|
|
122
|
+
try:
|
|
123
|
+
records, _total = await context.filesystem.get_files(filters, include_content=include_content)
|
|
124
|
+
except Exception:
|
|
125
|
+
logger.exception("Failed to list files", extra=context.session.current_ids())
|
|
126
|
+
return []
|
|
127
|
+
return records
|
|
128
|
+
|
|
129
|
+
@staticmethod
|
|
130
|
+
async def delete_file(
|
|
131
|
+
context: ModuleContext,
|
|
132
|
+
file_id: str,
|
|
133
|
+
file_context: Context = Context.MISSIONS,
|
|
134
|
+
*,
|
|
135
|
+
permanent: bool = False,
|
|
136
|
+
) -> bool:
|
|
137
|
+
"""Delete a file.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
context: Module context containing the filesystem strategy
|
|
141
|
+
file_id: Unique identifier for the file
|
|
142
|
+
file_context: The owner context to look the file up in
|
|
143
|
+
permanent: Whether to permanently delete the file
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
True when the file was deleted.
|
|
147
|
+
"""
|
|
148
|
+
try:
|
|
149
|
+
results, _deleted, _failed = await context.filesystem.delete_files(
|
|
150
|
+
FileFilter(context=file_context, file_ids=[file_id]),
|
|
151
|
+
permanent=permanent,
|
|
152
|
+
)
|
|
153
|
+
except Exception:
|
|
154
|
+
logger.exception("Failed to delete file '%s'", file_id, extra=context.session.current_ids())
|
|
155
|
+
return False
|
|
156
|
+
return results.get(file_id, False)
|
|
157
|
+
|
|
158
|
+
@staticmethod
|
|
159
|
+
async def resolve_files(
|
|
160
|
+
context: ModuleContext,
|
|
161
|
+
files: list[FileMetadata],
|
|
162
|
+
file_context: Context = Context.MISSIONS,
|
|
163
|
+
) -> list[FileMetadata]:
|
|
164
|
+
"""Backfill empty fields from what the filesystem service holds.
|
|
165
|
+
|
|
166
|
+
A setup form may submit little more than an id; the persisted entry has to stay
|
|
167
|
+
displayable, so anything the caller left empty is filled from the stored record.
|
|
168
|
+
A file the service cannot return is kept as submitted rather than dropped.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
context: Module context containing the filesystem strategy
|
|
172
|
+
files: The files as submitted
|
|
173
|
+
file_context: The owner context the files live in; setup-time uploads are
|
|
174
|
+
scoped to the setup, not the mission
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
The files, with empty fields filled in where the service could resolve them.
|
|
178
|
+
"""
|
|
179
|
+
resolved: list[FileMetadata] = []
|
|
180
|
+
for file in files:
|
|
181
|
+
try:
|
|
182
|
+
record = await context.filesystem.get_file(file.id, context=file_context, include_content=False)
|
|
183
|
+
except Exception:
|
|
184
|
+
logger.warning(
|
|
185
|
+
"Could not resolve file '%s'; keeping it as submitted",
|
|
186
|
+
file.id,
|
|
187
|
+
exc_info=True,
|
|
188
|
+
extra=context.session.current_ids(),
|
|
189
|
+
)
|
|
190
|
+
resolved.append(file)
|
|
191
|
+
continue
|
|
192
|
+
resolved.append(
|
|
193
|
+
file.model_copy(
|
|
194
|
+
update={
|
|
195
|
+
"name": file.name or record.name,
|
|
196
|
+
"type": file.type if file.type is not FileType.UNSPECIFIED else record.type,
|
|
197
|
+
"content_type": file.content_type or record.content_type,
|
|
198
|
+
"size_bytes": file.size_bytes or record.size_bytes,
|
|
199
|
+
"file_url": file.file_url or record.file_url,
|
|
200
|
+
}
|
|
201
|
+
)
|
|
202
|
+
)
|
|
203
|
+
return resolved
|
|
204
|
+
|
|
205
|
+
@staticmethod
|
|
206
|
+
async def set_visibility(context: ModuleContext, file_id: str, visibility: Visibility) -> FilesystemRecord:
|
|
207
|
+
"""Change the read-access scope of an already uploaded file.
|
|
208
|
+
|
|
209
|
+
Visibility is otherwise write-once at upload time, so this is the only way to
|
|
210
|
+
widen or narrow access to a file the module has already produced.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
context: Module context containing the filesystem strategy
|
|
214
|
+
file_id: Unique identifier for the file
|
|
215
|
+
visibility: The new read-access scope; UNSPECIFIED leaves it unchanged
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
The updated file record.
|
|
219
|
+
"""
|
|
220
|
+
return await context.filesystem.update_file(file_id, visibility=visibility)
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
"""Module model exports. Import ag_ui types from ``digitalkin.models.module.ag_ui``."""
|
|
2
2
|
|
|
3
|
+
from digitalkin.models.module.knowledge_files import (
|
|
4
|
+
KnowledgeFileFormatError,
|
|
5
|
+
knowledge_files_input,
|
|
6
|
+
)
|
|
3
7
|
from digitalkin.models.module.loaded_tools import (
|
|
4
8
|
LOADED_TOOLS_STORAGE_CONFIG,
|
|
5
9
|
LoadedToolRecord,
|
|
@@ -34,6 +38,7 @@ __all__ = [
|
|
|
34
38
|
"DataModel",
|
|
35
39
|
"DataTrigger",
|
|
36
40
|
"EndOfStreamOutput",
|
|
41
|
+
"KnowledgeFileFormatError",
|
|
37
42
|
"LoadedToolRecord",
|
|
38
43
|
"LoadedToolStore",
|
|
39
44
|
"ModuleContext",
|
|
@@ -47,5 +52,6 @@ __all__ = [
|
|
|
47
52
|
"ToolSelection",
|
|
48
53
|
"UtilityProtocol",
|
|
49
54
|
"UtilityRegistry",
|
|
55
|
+
"knowledge_files_input",
|
|
50
56
|
"tool_reference_input",
|
|
51
57
|
]
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""Setup field for files a module ingests at config-setup time.
|
|
2
|
+
|
|
3
|
+
Declares the pair every file-consuming module needs — the selected files and the
|
|
4
|
+
formats it accepts — so the field, its widget options and its validation stay
|
|
5
|
+
identical across modules::
|
|
6
|
+
|
|
7
|
+
class MySetup(SetupModel):
|
|
8
|
+
knowledge_files: knowledge_files_input(extensions=[".json"]) = Field(
|
|
9
|
+
default_factory=list,
|
|
10
|
+
title="Knowledge Files",
|
|
11
|
+
description="Files imported into setup-scoped storage at config-setup time.",
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
The allowed formats reach the front-end file widget as ``ui:options.accept`` and are
|
|
15
|
+
enforced again on submit, since the widget's filter is only a hint.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from collections.abc import Sequence
|
|
19
|
+
from typing import Annotated, Any
|
|
20
|
+
|
|
21
|
+
from pydantic import AfterValidator, Field
|
|
22
|
+
|
|
23
|
+
from digitalkin.models.services.filesystem import FileMetadata, FileType
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class KnowledgeFileFormatError(ValueError):
|
|
27
|
+
"""A submitted file is not in a format the module accepts."""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def knowledge_files_input(
|
|
31
|
+
extensions: Sequence[str] = (),
|
|
32
|
+
file_types: Sequence[FileType] = (),
|
|
33
|
+
*,
|
|
34
|
+
multiple: bool = True,
|
|
35
|
+
config: bool = True,
|
|
36
|
+
) -> Any:
|
|
37
|
+
"""Build the annotated type for a setup field holding uploaded files.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
extensions: Accepted file extensions, leading dot included (e.g. ``.pdf``).
|
|
41
|
+
Empty accepts any extension.
|
|
42
|
+
file_types: Accepted categories. Empty accepts any category.
|
|
43
|
+
multiple: Whether the widget allows selecting more than one file.
|
|
44
|
+
config: Whether the field belongs to the config-setup schema rather than
|
|
45
|
+
the runtime setup schema.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Annotated type for use in a `SetupModel` field.
|
|
49
|
+
"""
|
|
50
|
+
allowed_extensions = frozenset(e.lower() if e.startswith(".") else f".{e.lower()}" for e in extensions)
|
|
51
|
+
allowed_types = frozenset(file_types)
|
|
52
|
+
|
|
53
|
+
def validate_formats(files: list[FileMetadata]) -> list[FileMetadata]:
|
|
54
|
+
"""Reject any file whose extension or category the module does not accept.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
The files, unchanged.
|
|
58
|
+
|
|
59
|
+
Raises:
|
|
60
|
+
KnowledgeFileFormatError: If a file is in an unaccepted format.
|
|
61
|
+
"""
|
|
62
|
+
for file in files:
|
|
63
|
+
# A bare-id submission carries no name yet; the format is checked once the
|
|
64
|
+
# filesystem service has resolved it, not guessed at here.
|
|
65
|
+
suffix = f".{file.name.rsplit('.', 1)[-1].lower()}" if "." in file.name else ""
|
|
66
|
+
if suffix and allowed_extensions and suffix not in allowed_extensions:
|
|
67
|
+
msg = f"'{file.name}' is not an accepted format; expected one of {sorted(allowed_extensions)}"
|
|
68
|
+
raise KnowledgeFileFormatError(msg)
|
|
69
|
+
if allowed_types and file.type is not FileType.UNSPECIFIED and file.type not in allowed_types:
|
|
70
|
+
msg = (
|
|
71
|
+
f"'{file.name}' is a {file.type.name} file; expected one of {sorted(t.name for t in allowed_types)}"
|
|
72
|
+
)
|
|
73
|
+
raise KnowledgeFileFormatError(msg)
|
|
74
|
+
return files
|
|
75
|
+
|
|
76
|
+
ui_options: dict[str, Any] = {"multiple": multiple}
|
|
77
|
+
if allowed_extensions:
|
|
78
|
+
ui_options["accept"] = sorted(allowed_extensions)
|
|
79
|
+
schema_extra: dict[str, Any] = {"ui:widget": "file", "ui:options": ui_options}
|
|
80
|
+
if config:
|
|
81
|
+
schema_extra["config"] = True
|
|
82
|
+
|
|
83
|
+
return Annotated[
|
|
84
|
+
list[FileMetadata],
|
|
85
|
+
Field(json_schema_extra=schema_extra),
|
|
86
|
+
AfterValidator(validate_formats),
|
|
87
|
+
]
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
"""This module contains the models for the services."""
|
|
2
2
|
|
|
3
|
+
from digitalkin.models.services.filesystem import FileMetadata, FileType, FileUploadMetadata
|
|
3
4
|
from digitalkin.models.services.storage import BaseMessage, BaseRole, ChatHistory, Role
|
|
4
5
|
|
|
5
6
|
__all__ = [
|
|
6
7
|
"BaseMessage",
|
|
7
8
|
"BaseRole",
|
|
8
9
|
"ChatHistory",
|
|
10
|
+
"FileMetadata",
|
|
11
|
+
"FileType",
|
|
12
|
+
"FileUploadMetadata",
|
|
9
13
|
"Role",
|
|
10
14
|
]
|