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.
Files changed (273) hide show
  1. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/PKG-INFO +2 -2
  2. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/services/filesystem_module.py +7 -6
  3. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/pyproject.toml +45 -45
  4. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/__version__.py +1 -1
  5. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/action.py +1 -1
  6. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/file_history_mixin.py +4 -3
  7. digitalkin-1.0.4.dev7/src/digitalkin/mixins/filesystem_mixin.py +220 -0
  8. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/__init__.py +6 -0
  9. digitalkin-1.0.4.dev7/src/digitalkin/models/module/knowledge_files.py +87 -0
  10. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/services/__init__.py +4 -0
  11. digitalkin-1.0.4.dev7/src/digitalkin/models/services/filesystem.py +127 -0
  12. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/services/storage.py +3 -9
  13. digitalkin-1.0.4.dev7/src/digitalkin/services/filesystem/__init__.py +19 -0
  14. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/filesystem/default_filesystem.py +29 -22
  15. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/filesystem/filesystem_strategy.py +49 -49
  16. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/filesystem/grpc_filesystem.py +18 -40
  17. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/development_mode_action.py +2 -2
  18. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin.egg-info/PKG-INFO +2 -2
  19. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin.egg-info/SOURCES.txt +2 -0
  20. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin.egg-info/requires.txt +1 -1
  21. digitalkin-1.0.4.dev5/src/digitalkin/mixins/filesystem_mixin.py +0 -46
  22. digitalkin-1.0.4.dev5/src/digitalkin/services/filesystem/__init__.py +0 -7
  23. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/LICENSE +0 -0
  24. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/README.md +0 -0
  25. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/__init__.py +0 -0
  26. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/mock/__init__.py +0 -0
  27. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/mock/mock_pb2.py +0 -0
  28. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  29. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/server_async_insecure.py +0 -0
  30. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/server_async_secure.py +0 -0
  31. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/server_sync_insecure.py +0 -0
  32. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/base_server/server_sync_secure.py +0 -0
  33. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/__init__.py +0 -0
  34. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/echo_module.py +0 -0
  35. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/models/__init__.py +0 -0
  36. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/models/input.py +0 -0
  37. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/models/output.py +0 -0
  38. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/models/secret.py +0 -0
  39. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/models/setup.py +0 -0
  40. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/server.py +0 -0
  41. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/triggers/__init__.py +0 -0
  42. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/bench_module/triggers/message_trigger.py +0 -0
  43. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/__init__.py +0 -0
  44. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/archetype_with_tools_module.py +0 -0
  45. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/cpu_intensive_module.py +0 -0
  46. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/dynamic_setup_module.py +0 -0
  47. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/minimal_llm_module.py +0 -0
  48. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/modules/text_transform_module.py +0 -0
  49. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  50. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  51. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  52. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  53. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  54. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/monitoring/tests/test_metrics.py +0 -0
  55. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/client.py +0 -0
  56. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/echo_module.py +0 -0
  57. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/models/__init__.py +0 -0
  58. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/models/input.py +0 -0
  59. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/models/output.py +0 -0
  60. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/models/secret.py +0 -0
  61. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/models/setup.py +0 -0
  62. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/server.py +0 -0
  63. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/triggers/__init__.py +0 -0
  64. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/redis_demo/triggers/message_trigger.py +0 -0
  65. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/examples/services/storage_module.py +0 -0
  66. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/setup.cfg +0 -0
  67. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/__init__.py +0 -0
  68. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/__init__.py +0 -0
  69. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/__init__.py +0 -0
  70. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/agno_adapter.py +0 -0
  71. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/agui_tools.py +0 -0
  72. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/hitl.py +0 -0
  73. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/models.py +0 -0
  74. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/module_toolkit.py +0 -0
  75. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
  76. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/base.py +0 -0
  77. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/chat_history.py +0 -0
  78. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
  79. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
  80. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/base.py +0 -0
  81. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
  82. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +0 -0
  83. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +0 -0
  84. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
  85. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +0 -0
  86. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +0 -0
  87. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
  88. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/services/action.py +0 -0
  89. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +0 -0
  90. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
  91. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +0 -0
  92. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +0 -0
  93. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/community/agno/toolkits/user_profile.py +0 -0
  94. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/__init__.py +0 -0
  95. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/common/__init__.py +0 -0
  96. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/common/factories.py +0 -0
  97. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/exceptions.py +0 -0
  98. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/job_manager/__init__.py +0 -0
  99. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  100. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
  101. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/profiling/__init__.py +0 -0
  102. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/profiling/step_timer.py +0 -0
  103. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/profiling/task_profiler.py +0 -0
  104. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/resilience/__init__.py +0 -0
  105. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/resilience/bulkhead.py +0 -0
  106. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  107. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/__init__.py +0 -0
  108. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
  109. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
  110. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/module_runner.py +0 -0
  111. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
  112. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
  113. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
  114. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
  115. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
  116. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
  117. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  118. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/task_executor.py +0 -0
  119. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/core/task_manager/task_session.py +0 -0
  120. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/exceptions.py +0 -0
  121. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/__init__.py +0 -0
  122. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  123. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/exceptions.py +0 -0
  124. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/gateway_servicer.py +0 -0
  125. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  126. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
  127. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
  128. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/m2m_call_registry.py +0 -0
  129. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/module_server.py +0 -0
  130. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
  131. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
  132. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/stream_session.py +0 -0
  133. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  134. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
  135. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
  136. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
  137. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
  138. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
  139. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/logger.py +0 -0
  140. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/__init__.py +0 -0
  141. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/agui_mixin.py +0 -0
  142. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/base_mixin.py +0 -0
  143. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/cost_mixin.py +0 -0
  144. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/logger_mixin.py +0 -0
  145. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/mixins/storage_mixin.py +0 -0
  146. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/__init__.py +0 -0
  147. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/core/__init__.py +0 -0
  148. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/core/job_manager_models.py +0 -0
  149. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/core/redis.py +0 -0
  150. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/core/task_monitor.py +0 -0
  151. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/events/__init__.py +0 -0
  152. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/events/agent_events.py +0 -0
  153. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  154. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
  155. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
  156. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/models.py +0 -0
  157. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
  158. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/grpc_servers/types.py +0 -0
  159. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/ag_ui.py +0 -0
  160. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/base_types.py +0 -0
  161. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/loaded_tools.py +0 -0
  162. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/module.py +0 -0
  163. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/module_context.py +0 -0
  164. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/module_types.py +0 -0
  165. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/request_metadata.py +0 -0
  166. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/select_schema.py +0 -0
  167. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/setup_types.py +0 -0
  168. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/tool_cache.py +0 -0
  169. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/tool_reference.py +0 -0
  170. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/module/utility.py +0 -0
  171. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/services/cost.py +0 -0
  172. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/services/registry.py +0 -0
  173. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/services/services.py +0 -0
  174. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/__init__.py +0 -0
  175. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/certificate.py +0 -0
  176. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/client/__init__.py +0 -0
  177. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/client/channel.py +0 -0
  178. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/client/circuit_breaker.py +0 -0
  179. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/client/client.py +0 -0
  180. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/client/grpc.py +0 -0
  181. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/gateway.py +0 -0
  182. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/log.py +0 -0
  183. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/module.py +0 -0
  184. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/profiling.py +0 -0
  185. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/queue.py +0 -0
  186. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/redis.py +0 -0
  187. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/registry.py +0 -0
  188. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/resilience.py +0 -0
  189. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/server/__init__.py +0 -0
  190. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/server/channel.py +0 -0
  191. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/server/grpc.py +0 -0
  192. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/server/server.py +0 -0
  193. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/server/servicer.py +0 -0
  194. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/task_manager.py +0 -0
  195. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  196. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/settings/utils/channel.py +0 -0
  197. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/utils/__init__.py +0 -0
  198. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
  199. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/__init__.py +0 -0
  200. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/_base_module.py +0 -0
  201. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/archetype_module.py +0 -0
  202. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/tool_module.py +0 -0
  203. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/trigger_handler.py +0 -0
  204. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/triggers/__init__.py +0 -0
  205. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
  206. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
  207. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
  208. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/py.typed +0 -0
  209. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/__init__.py +0 -0
  210. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/base_strategy.py +0 -0
  211. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/communication/__init__.py +0 -0
  212. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/communication/communication_strategy.py +0 -0
  213. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/communication/default_communication.py +0 -0
  214. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/communication/exceptions.py +0 -0
  215. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/communication/grpc_communication.py +0 -0
  216. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/cost/__init__.py +0 -0
  217. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  218. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/cost/default_cost.py +0 -0
  219. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/cost/exceptions.py +0 -0
  220. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  221. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/filesystem/exceptions.py +0 -0
  222. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/identity/__init__.py +0 -0
  223. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/identity/default_identity.py +0 -0
  224. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  225. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/__init__.py +0 -0
  226. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/default_registry.py +0 -0
  227. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/exceptions.py +0 -0
  228. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/grpc_registry.py +0 -0
  229. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/registry_models.py +0 -0
  230. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/registry/registry_strategy.py +0 -0
  231. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/secret/__init__.py +0 -0
  232. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/secret/default_secret.py +0 -0
  233. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/secret/exceptions.py +0 -0
  234. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/secret/grpc_secret.py +0 -0
  235. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/secret/secret_strategy.py +0 -0
  236. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/services_config.py +0 -0
  237. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/services_models.py +0 -0
  238. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/setup/__init__.py +0 -0
  239. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/setup/default_setup.py +0 -0
  240. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/setup/exceptions.py +0 -0
  241. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/setup/grpc_setup.py +0 -0
  242. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/setup/setup_strategy.py +0 -0
  243. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/storage/__init__.py +0 -0
  244. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/storage/default_storage.py +0 -0
  245. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/storage/exceptions.py +0 -0
  246. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/storage/grpc_storage.py +0 -0
  247. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  248. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/task_manager/__init__.py +0 -0
  249. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
  250. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/task_manager/exceptions.py +0 -0
  251. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  252. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  253. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/user_profile/__init__.py +0 -0
  254. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  255. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/user_profile/exceptions.py +0 -0
  256. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
  257. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  258. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/__init__.py +0 -0
  259. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/arg_parser.py +0 -0
  260. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/conditional_schema.py +0 -0
  261. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/dynamic_schema.py +0 -0
  262. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/env_manager.py +0 -0
  263. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/env_template.py +0 -0
  264. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/exceptions.py +0 -0
  265. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/json_structure.py +0 -0
  266. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  267. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/package_discover.py +0 -0
  268. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/proto_utils.py +0 -0
  269. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/schema_splitter.py +0 -0
  270. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin/utils/setup_content_validator.py +0 -0
  271. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  272. {digitalkin-1.0.4.dev5 → digitalkin-1.0.4.dev7}/src/digitalkin.egg-info/top_level.txt +0 -0
  273. {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.dev5
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.dev2
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.filesystem_strategy import FileFilter, UploadFileData
13
+ from digitalkin.models.services.filesystem import FileType
14
+ from digitalkin.services.filesystem import FileFilter, UploadFileData
14
15
  from digitalkin.services.services_config import ServicesConfig
15
16
  from digitalkin.services.services_models import ServicesMode
16
17
 
@@ -118,9 +119,9 @@ class ExampleModule(ArchetypeModule[ExampleInput, ExampleOutput, ExampleSetup, E
118
119
  file = UploadFileData(
119
120
  content=b"%s\n%s" % (processed_message.encode(), str(processed_number).encode()),
120
121
  name="example_output.txt",
121
- file_type="text/plain",
122
+ type=FileType.DOCUMENT,
122
123
  content_type="text/plain",
123
- metadata={"example_key": "example_value"},
124
+ metadata={"sdk_created": True},
124
125
  replace_if_exists=True,
125
126
  )
126
127
 
@@ -176,10 +177,10 @@ async def test_module() -> None:
176
177
  # Check the storage
177
178
  if module.status == ModuleStatus.STOPPED:
178
179
  files, _nb_results = await module.filesystem.get_files(
179
- filters=FileFilter(name="example_output.txt", context="test-mission-123"),
180
+ filters=FileFilter(names=["example_output.txt"]),
180
181
  )
181
182
  for file in files:
182
- await module.filesystem.update_file(file.id, file_type="updated")
183
+ await module.filesystem.update_file(file.id, type=FileType.OTHER)
183
184
  # module.filesystem.delete_files(filters=FileFilter(name="example_output.txt", context="test-mission-123"), permanent=True)
184
185
 
185
186
  logger.info("Retrieved file: %s with ID: %s", file.name, file.id)
@@ -188,7 +189,7 @@ async def test_module() -> None:
188
189
  if file_record:
189
190
  logger.info("File ID: %s", file_record.id)
190
191
  logger.info("File name: %s", file_record.name)
191
- logger.info("File type: %s", file_record.file_type)
192
+ logger.info("File type: %s", file_record.type)
192
193
  logger.info("File status: %s", file_record.status)
193
194
  logger.info("File content: %s", file_record.content.decode())
194
195
  except Exception:
@@ -31,7 +31,7 @@
31
31
  # which is how a nested run's output is attributed to its author. Pinned exactly
32
32
  # because it is a dated prerelease; move to >=0.1.21 once that ships stable.
33
33
  "ag-ui-protocol==0.1.21.dev1787220377",
34
- "agentic-mesh-protocol==1.0.2.dev2",
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.dev5"
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
- "ANN401", # Allow typing.Any — gRPC stubs, callbacks, and dynamic APIs require it
212
- "COM812", # Disable because of formatter incompatibility
213
- "DOC502", # Allow extraneous-exception in docstring
214
- "F401", # Allow unused imports — used for availability checks
215
- "N802", # Allow PascalCase methods — gRPC servicer convention
216
- "PLC0415", # Allow lazy imports — needed to break circular dependencies
217
- "PLW3201", # Allow __get_pydantic_core_schema__ — Pydantic dunder hook
218
- "S105", # Hardcoded-password
219
- "S403", # Allow pickle import
211
+ "any-type", # Allow typing.Any — gRPC stubs, callbacks, and dynamic APIs require it
212
+ "missing-trailing-comma", # Disable because of formatter incompatibility
213
+ "docstring-extraneous-exception", # Allow extraneous-exception in docstring
214
+ "unused-import", # Allow unused imports — used for availability checks
215
+ "invalid-function-name", # Allow PascalCase methods — gRPC servicer convention
216
+ "import-outside-top-level", # Allow lazy imports — needed to break circular dependencies
217
+ "bad-dunder-method-name", # Allow __get_pydantic_core_schema__ — Pydantic dunder hook
218
+ "hardcoded-password-string", # Hardcoded-password
219
+ "suspicious-pickle-import", # Allow pickle import
220
220
  ]
221
221
 
222
222
  fixable = [ "ALL" ]
@@ -226,40 +226,40 @@ version = "1.0.4.dev5"
226
226
 
227
227
  [tool.ruff.lint.per-file-ignores]
228
228
  "tests/**/*.py" = [
229
- "ANN001",
230
- "ANN002",
231
- "ANN003",
232
- "ANN201",
233
- "ANN401",
234
- "ARG001",
235
- "ARG002",
236
- "C901",
237
- "D100",
238
- "D101",
239
- "D102",
240
- "D103",
241
- "D107",
242
- "D417",
243
- "DOC201",
244
- "DOC501",
245
- "E501",
246
- "ERA001",
247
- "FBT001",
248
- "FBT002",
249
- "G004",
250
- "N802",
251
- "PERF203",
252
- "PLC2701",
253
- "PLR0911",
254
- "PLR0912",
255
- "PLR0914",
256
- "PLR0915",
257
- "PLR1702",
258
- "PLR2004",
259
- "PLR6301",
260
- "S101",
261
- "SLF001",
262
- "TRY002",
229
+ "missing-type-function-argument",
230
+ "missing-type-args",
231
+ "missing-type-kwargs",
232
+ "missing-return-type-undocumented-public-function",
233
+ "any-type",
234
+ "unused-function-argument",
235
+ "unused-method-argument",
236
+ "complex-structure",
237
+ "undocumented-public-module",
238
+ "undocumented-public-class",
239
+ "undocumented-public-method",
240
+ "undocumented-public-function",
241
+ "undocumented-public-init",
242
+ "undocumented-param",
243
+ "docstring-missing-returns",
244
+ "docstring-missing-exception",
245
+ "line-too-long",
246
+ "commented-out-code",
247
+ "boolean-type-hint-positional-argument",
248
+ "boolean-default-value-positional-argument",
249
+ "logging-f-string",
250
+ "invalid-function-name",
251
+ "try-except-in-loop",
252
+ "import-private-name",
253
+ "too-many-return-statements",
254
+ "too-many-branches",
255
+ "too-many-locals",
256
+ "too-many-statements",
257
+ "too-many-nested-blocks",
258
+ "magic-value-comparison",
259
+ "no-self-use",
260
+ "assert",
261
+ "private-member-access",
262
+ "raise-vanilla-class",
263
263
  ]
264
264
 
265
265
  [tool.ruff.lint.pylint]
@@ -5,4 +5,4 @@ from importlib.metadata import PackageNotFoundError, version
5
5
  try:
6
6
  __version__ = version("digitalkin")
7
7
  except PackageNotFoundError:
8
- __version__ = "1.0.4.dev5"
8
+ __version__ = "1.0.4.dev7"
@@ -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
- "documentation": (setup.documentation or "")[: self._DOC_PREVIEW_CHARS],
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.storage import FileHistory, FileModel
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[FileModel]) -> None:
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: List of file models to append.
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
  ]