synapse-sdk 2025.10.4__tar.gz → 2025.10.5__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.

Potentially problematic release.


This version of synapse-sdk might be problematic. Click here for more details.

Files changed (570) hide show
  1. {synapse_sdk-2025.10.4/synapse_sdk.egg-info → synapse_sdk-2025.10.5}/PKG-INFO +1 -1
  2. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-overview.md +25 -0
  3. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-overview.md +25 -0
  4. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/action.py +8 -1
  5. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/context.py +0 -1
  6. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/steps/generate.py +6 -2
  7. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/steps/initialize.py +24 -9
  8. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +27 -7
  9. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +45 -12
  10. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/steps/upload.py +10 -5
  11. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py +31 -6
  12. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py +65 -37
  13. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/default.py +17 -2
  14. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5/synapse_sdk.egg-info}/PKG-INFO +1 -1
  15. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk.egg-info/SOURCES.txt +1 -0
  16. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/integration/test_workflow.py +86 -0
  17. synapse_sdk-2025.10.5/tests/plugins/upload/strategies/test_file_discovery.py +201 -0
  18. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/.claude/commands/compare-branch.md +0 -0
  19. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/.claude/commands/review-pr.md +0 -0
  20. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/.claude/commands/update-pr-desc.md +0 -0
  21. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/.claude/commands/update-pr-title.md +0 -0
  22. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/.github/workflows/lint.yml +0 -0
  23. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/.github/workflows/pypi-publish.yml +0 -0
  24. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/.github/workflows/test.yml +0 -0
  25. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/.gitignore +0 -0
  26. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/.mcp.json +0 -0
  27. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/.pre-commit-config.yaml +0 -0
  28. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/AGENT.md +0 -0
  29. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/CLAUDE.md +0 -0
  30. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/GEMINI.md +0 -0
  31. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/LICENSE +0 -0
  32. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/Makefile +0 -0
  33. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/P1_rules.md +0 -0
  34. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/P2_rules.md +0 -0
  35. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/P3_rules.md +0 -0
  36. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/P4_rules.md +0 -0
  37. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/README.md +0 -0
  38. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/locale/en/LC_MESSAGES/messages.mo +0 -0
  39. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/locale/en/LC_MESSAGES/messages.po +0 -0
  40. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/locale/ko/LC_MESSAGES/messages.mo +0 -0
  41. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/locale/ko/LC_MESSAGES/messages.po +0 -0
  42. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/pyproject.toml +0 -0
  43. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/pytest-ci.ini +0 -0
  44. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/pytest.ini +0 -0
  45. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/requirements.test.txt +0 -0
  46. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/requirements.txt +0 -0
  47. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/setup.cfg +0 -0
  48. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/__init__.py +0 -0
  49. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/__init__.py +0 -0
  50. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/alias/__init__.py +0 -0
  51. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/alias/create.py +0 -0
  52. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/alias/dataclass.py +0 -0
  53. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/alias/default.py +0 -0
  54. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/alias/delete.py +0 -0
  55. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/alias/list.py +0 -0
  56. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/alias/read.py +0 -0
  57. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/alias/update.py +0 -0
  58. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/alias/utils.py +0 -0
  59. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/code_server.py +0 -0
  60. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/config.py +0 -0
  61. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/devtools.py +0 -0
  62. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/plugin/__init__.py +0 -0
  63. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/plugin/create.py +0 -0
  64. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/plugin/publish.py +0 -0
  65. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/cli/plugin/run.py +0 -0
  66. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/__init__.py +0 -0
  67. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/agent/__init__.py +0 -0
  68. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/agent/core.py +0 -0
  69. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/agent/ray.py +0 -0
  70. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/agent/service.py +0 -0
  71. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/backend/__init__.py +0 -0
  72. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/backend/annotation.py +0 -0
  73. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/backend/core.py +0 -0
  74. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/backend/data_collection.py +0 -0
  75. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/backend/hitl.py +0 -0
  76. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/backend/integration.py +0 -0
  77. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/backend/ml.py +0 -0
  78. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/backend/models.py +0 -0
  79. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/base.py +0 -0
  80. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/exceptions.py +0 -0
  81. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/ray/__init__.py +0 -0
  82. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/ray/core.py +0 -0
  83. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/ray/serve.py +0 -0
  84. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/utils.py +0 -0
  85. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/validators/__init__.py +0 -0
  86. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/clients/validators/collections.py +0 -0
  87. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/__init__.py +0 -0
  88. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/config.py +0 -0
  89. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/.gitignore +0 -0
  90. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/README.md +0 -0
  91. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +0 -0
  92. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +0 -0
  93. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +0 -0
  94. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
  95. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +0 -0
  96. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/blog/authors.yml +0 -0
  97. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/blog/tags.yml +0 -0
  98. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/agent.md +0 -0
  99. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/annotation-mixin.md +0 -0
  100. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/backend.md +0 -0
  101. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/base.md +0 -0
  102. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/core-mixin.md +0 -0
  103. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/data-collection-mixin.md +0 -0
  104. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/hitl-mixin.md +0 -0
  105. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/index.md +0 -0
  106. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/integration-mixin.md +0 -0
  107. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/ml-mixin.md +0 -0
  108. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/clients/ray.md +0 -0
  109. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/index.md +0 -0
  110. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/plugins/categories.md +0 -0
  111. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/plugins/models.md +0 -0
  112. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/api/plugins/utils.md +0 -0
  113. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/categories.md +0 -0
  114. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/cli-usage.md +0 -0
  115. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/concepts/index.md +0 -0
  116. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/configuration.md +0 -0
  117. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/contributing.md +0 -0
  118. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/examples/index.md +0 -0
  119. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/faq.md +0 -0
  120. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/features/converters/index.md +0 -0
  121. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/features/index.md +0 -0
  122. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/features/utils/file.md +0 -0
  123. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/features/utils/network.md +0 -0
  124. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/features/utils/storage.md +0 -0
  125. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/features/utils/types.md +0 -0
  126. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/installation.md +0 -0
  127. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/introduction.md +0 -0
  128. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +0 -0
  129. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-action-development.md +0 -0
  130. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-overview.md +0 -0
  131. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/plugins/categories/pre-annotation-plugins/to-task-template-development.md +0 -0
  132. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-action.md +0 -0
  133. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-template.md +0 -0
  134. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/plugins/export-plugins.md +0 -0
  135. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/plugins/plugins.md +0 -0
  136. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/quickstart.md +0 -0
  137. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/troubleshooting.md +0 -0
  138. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-basics/_category_.json +0 -0
  139. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-basics/congratulations.md +0 -0
  140. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-blog-post.md +0 -0
  141. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-document.md +0 -0
  142. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-basics/create-a-page.md +0 -0
  143. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-basics/deploy-your-site.md +0 -0
  144. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-basics/markdown-features.mdx +0 -0
  145. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-extras/_category_.json +0 -0
  146. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
  147. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-extras/img/localeDropdown.png +0 -0
  148. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-extras/manage-docs-versions.md +0 -0
  149. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docs/tutorial-extras/translate-your-site.md +0 -0
  150. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/docusaurus.config.ts +0 -0
  151. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/code.json +0 -0
  152. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/agent.md +0 -0
  153. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/annotation-mixin.md +0 -0
  154. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/backend.md +0 -0
  155. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/base.md +0 -0
  156. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/core-mixin.md +0 -0
  157. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/data-collection-mixin.md +0 -0
  158. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/hitl-mixin.md +0 -0
  159. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/index.md +0 -0
  160. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/integration-mixin.md +0 -0
  161. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ml-mixin.md +0 -0
  162. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/clients/ray.md +0 -0
  163. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/index.md +0 -0
  164. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/api/plugins/models.md +0 -0
  165. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/categories.md +0 -0
  166. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/cli-usage.md +0 -0
  167. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/concepts/index.md +0 -0
  168. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/configuration.md +0 -0
  169. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/contributing.md +0 -0
  170. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/examples/index.md +0 -0
  171. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/faq.md +0 -0
  172. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/converters/index.md +0 -0
  173. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/index.md +0 -0
  174. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/file.md +0 -0
  175. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/network.md +0 -0
  176. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/storage.md +0 -0
  177. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/features/utils/types.md +0 -0
  178. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/installation.md +0 -0
  179. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +0 -0
  180. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/pre-annotation-plugin-overview.md +0 -0
  181. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-action-development.md +0 -0
  182. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-overview.md +0 -0
  183. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/pre-annotation-plugins/to-task-template-development.md +0 -0
  184. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-action.md +0 -0
  185. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-template.md +0 -0
  186. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/export-plugins.md +0 -0
  187. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/plugins.md +0 -0
  188. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/quickstart.md +0 -0
  189. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/troubleshooting.md +0 -0
  190. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +0 -0
  191. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/footer.json +0 -0
  192. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/i18n/ko/docusaurus-theme-classic/navbar.json +0 -0
  193. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/package-lock.json +0 -0
  194. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/package.json +0 -0
  195. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/sidebars.ts +0 -0
  196. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +0 -0
  197. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +0 -0
  198. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/src/css/custom.css +0 -0
  199. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/src/pages/index.module.css +0 -0
  200. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/src/pages/index.tsx +0 -0
  201. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/src/pages/markdown-page.md +0 -0
  202. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/static/.nojekyll +0 -0
  203. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
  204. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
  205. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
  206. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/static/img/logo.png +0 -0
  207. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +0 -0
  208. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +0 -0
  209. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +0 -0
  210. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/docs/tsconfig.json +0 -0
  211. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/server.py +0 -0
  212. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/__init__.py +0 -0
  213. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/app.py +0 -0
  214. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/services/__init__.py +0 -0
  215. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/services/job_service.py +0 -0
  216. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/services/plugin_service.py +0 -0
  217. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/services/serve_service.py +0 -0
  218. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/ui/__init__.py +0 -0
  219. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/ui/config_tab.py +0 -0
  220. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/ui/deployment_tab.py +0 -0
  221. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/ui/http_tab.py +0 -0
  222. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/ui/jobs_tab.py +0 -0
  223. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/ui/serve_tab.py +0 -0
  224. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/ui/status_bar.py +0 -0
  225. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/utils/__init__.py +0 -0
  226. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/utils/json_viewer.py +0 -0
  227. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/utils/log_formatter.py +0 -0
  228. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/utils/styles.py +0 -0
  229. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app/utils/ui_components.py +0 -0
  230. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/devtools/streamlit_app.py +0 -0
  231. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/i18n.py +0 -0
  232. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/loggers.py +0 -0
  233. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/README.md +0 -0
  234. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/__init__.py +0 -0
  235. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/__init__.py +0 -0
  236. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/base.py +0 -0
  237. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/data_validation/__init__.py +0 -0
  238. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/data_validation/actions/__init__.py +0 -0
  239. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/data_validation/actions/validation.py +0 -0
  240. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/data_validation/templates/config.yaml +0 -0
  241. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/data_validation/templates/plugin/__init__.py +0 -0
  242. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +0 -0
  243. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/decorators.py +0 -0
  244. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/__init__.py +0 -0
  245. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/actions/__init__.py +0 -0
  246. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/actions/export/__init__.py +0 -0
  247. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/actions/export/action.py +0 -0
  248. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/actions/export/enums.py +0 -0
  249. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/actions/export/exceptions.py +0 -0
  250. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/actions/export/models.py +0 -0
  251. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/actions/export/run.py +0 -0
  252. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/actions/export/utils.py +0 -0
  253. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/templates/config.yaml +0 -0
  254. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +0 -0
  255. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/export/templates/plugin/export.py +0 -0
  256. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/__init__.py +0 -0
  257. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/actions/__init__.py +0 -0
  258. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/actions/deployment.py +0 -0
  259. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/actions/gradio.py +0 -0
  260. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/actions/inference.py +0 -0
  261. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/actions/test.py +0 -0
  262. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/actions/train.py +0 -0
  263. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/actions/tune.py +0 -0
  264. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/base/__init__.py +0 -0
  265. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/base/inference.py +0 -0
  266. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/templates/config.yaml +0 -0
  267. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/templates/plugin/__init__.py +0 -0
  268. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +0 -0
  269. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/templates/plugin/test.py +0 -0
  270. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/neural_net/templates/plugin/train.py +0 -0
  271. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/post_annotation/__init__.py +0 -0
  272. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/post_annotation/actions/__init__.py +0 -0
  273. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/post_annotation/actions/post_annotation.py +0 -0
  274. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/post_annotation/templates/config.yaml +0 -0
  275. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/post_annotation/templates/plugin/__init__.py +0 -0
  276. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/post_annotation/templates/plugin/post_annotation.py +0 -0
  277. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/__init__.py +0 -0
  278. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +0 -0
  279. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +0 -0
  280. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/action.py +0 -0
  281. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py +0 -0
  282. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +0 -0
  283. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +0 -0
  284. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +0 -0
  285. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +0 -0
  286. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +0 -0
  287. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +0 -0
  288. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +0 -0
  289. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +0 -0
  290. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +0 -0
  291. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +0 -0
  292. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +0 -0
  293. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +0 -0
  294. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +0 -0
  295. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +0 -0
  296. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +0 -0
  297. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +0 -0
  298. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +0 -0
  299. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/__init__.py +0 -0
  300. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/pre_annotation.py +0 -0
  301. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +0 -0
  302. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/registry.py +0 -0
  303. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/smart_tool/__init__.py +0 -0
  304. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/smart_tool/actions/__init__.py +0 -0
  305. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/smart_tool/actions/auto_label.py +0 -0
  306. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +0 -0
  307. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/smart_tool/templates/plugin/__init__.py +0 -0
  308. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/smart_tool/templates/plugin/auto_label.py +0 -0
  309. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/templates.py +0 -0
  310. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/__init__.py +0 -0
  311. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/__init__.py +0 -0
  312. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +0 -0
  313. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/enums.py +0 -0
  314. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/exceptions.py +0 -0
  315. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/factory.py +0 -0
  316. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/models.py +0 -0
  317. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/orchestrator.py +0 -0
  318. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/registry.py +0 -0
  319. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/run.py +0 -0
  320. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/steps/__init__.py +0 -0
  321. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/steps/base.py +0 -0
  322. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +0 -0
  323. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/steps/collection.py +0 -0
  324. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/steps/validate.py +0 -0
  325. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/__init__.py +0 -0
  326. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/base.py +0 -0
  327. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/__init__.py +0 -0
  328. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.py +0 -0
  329. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py +0 -0
  330. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py +0 -0
  331. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py +0 -0
  332. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py +0 -0
  333. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py +0 -0
  334. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/__init__.py +0 -0
  335. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/async_upload.py +0 -0
  336. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/upload/sync.py +0 -0
  337. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/strategies/validation/__init__.py +0 -0
  338. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/actions/upload/utils.py +0 -0
  339. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/templates/README.md +0 -0
  340. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/templates/config.yaml +0 -0
  341. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +0 -0
  342. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +0 -0
  343. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/enums.py +0 -0
  344. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/exceptions.py +0 -0
  345. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/models.py +0 -0
  346. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/cookiecutter.json +0 -0
  347. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/hooks/post_gen_project.py +0 -0
  348. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/hooks/pre_prompt.py +0 -0
  349. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/plugin-config-schema.json +0 -0
  350. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/schema.json +0 -0
  351. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.gitignore +0 -0
  352. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.pre-commit-config.yaml +0 -0
  353. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/README.md +0 -0
  354. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +0 -0
  355. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/plugin/__init__.py +0 -0
  356. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/pyproject.toml +0 -0
  357. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +0 -0
  358. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/upload.py +0 -0
  359. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/utils/__init__.py +0 -0
  360. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/utils/actions.py +0 -0
  361. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/utils/config.py +0 -0
  362. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/utils/legacy.py +0 -0
  363. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/plugins/utils/registry.py +0 -0
  364. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/shared/__init__.py +0 -0
  365. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/shared/enums.py +0 -0
  366. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/types.py +0 -0
  367. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/__init__.py +0 -0
  368. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/__init__.py +0 -0
  369. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/coco/__init__.py +0 -0
  370. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/coco/from_dm.py +0 -0
  371. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/coco/to_dm.py +0 -0
  372. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/dm/__init__.py +0 -0
  373. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/dm/from_v1.py +0 -0
  374. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/dm/to_v1.py +0 -0
  375. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/pascal/__init__.py +0 -0
  376. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/pascal/from_dm.py +0 -0
  377. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/pascal/to_dm.py +0 -0
  378. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/yolo/__init__.py +0 -0
  379. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/yolo/from_dm.py +0 -0
  380. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/converters/yolo/to_dm.py +0 -0
  381. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/dataset.py +0 -0
  382. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/debug.py +0 -0
  383. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/encryption.py +0 -0
  384. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/file/__init__.py +0 -0
  385. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/file/archive.py +0 -0
  386. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/file/checksum.py +0 -0
  387. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/file/chunking.py +0 -0
  388. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/file/download.py +0 -0
  389. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/file/encoding.py +0 -0
  390. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/file/io.py +0 -0
  391. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/file/video/__init__.py +0 -0
  392. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/file/video/transcode.py +0 -0
  393. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/file.py.backup +0 -0
  394. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/http.py +0 -0
  395. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/module_loading.py +0 -0
  396. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/network.py +0 -0
  397. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/pydantic/__init__.py +0 -0
  398. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/pydantic/config.py +0 -0
  399. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/pydantic/errors.py +0 -0
  400. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/pydantic/validators.py +0 -0
  401. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/storage/__init__.py +0 -0
  402. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/storage/providers/__init__.py +0 -0
  403. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/storage/providers/file_system.py +0 -0
  404. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/storage/providers/gcp.py +0 -0
  405. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/storage/providers/http.py +0 -0
  406. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/storage/providers/s3.py +0 -0
  407. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/storage/providers/sftp.py +0 -0
  408. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/storage/registry.py +0 -0
  409. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk/utils/string.py +0 -0
  410. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk.egg-info/dependency_links.txt +0 -0
  411. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk.egg-info/entry_points.txt +0 -0
  412. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk.egg-info/requires.txt +0 -0
  413. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/synapse_sdk.egg-info/top_level.txt +0 -0
  414. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/README.md +0 -0
  415. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/__init__.py +0 -0
  416. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/clients/__init__.py +0 -0
  417. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/clients/conftest.py +0 -0
  418. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/clients/test_backend_models.py +0 -0
  419. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/clients/test_base_client.py +0 -0
  420. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/clients/test_collection_validators.py +0 -0
  421. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/clients/test_ray_client.py +0 -0
  422. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/conftest.py +0 -0
  423. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/loggers/__init__.py +0 -0
  424. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/loggers/conftest.py +0 -0
  425. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/loggers/test_base_logger.py +0 -0
  426. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/conftest.py +0 -0
  427. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/data_validation/__init__.py +0 -0
  428. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/data_validation/validation/__init__.py +0 -0
  429. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/data_validation/validation/test_validation_action.py +0 -0
  430. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/fixtures/__init__.py +0 -0
  431. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/integration/__init__.py +0 -0
  432. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/steps/__init__.py +0 -0
  433. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/strategies/__init__.py +0 -0
  434. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/test_action.py +0 -0
  435. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/test_context.py +0 -0
  436. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/test_enums.py +0 -0
  437. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/test_exceptions.py +0 -0
  438. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/test_models.py +0 -0
  439. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/test_orchestrator.py +0 -0
  440. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/test_run.py +0 -0
  441. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/upload/test_utils.py +0 -0
  442. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/utils/__init__.py +0 -0
  443. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/utils/test_actions.py +0 -0
  444. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/utils/test_config.py +0 -0
  445. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/plugins/utils/test_registry.py +0 -0
  446. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/test_cli.py +0 -0
  447. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/test_cli_integration.py +0 -0
  448. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/test_data/metadata.xlsx +0 -0
  449. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/__init__,py +0 -0
  450. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/__init__.py +0 -0
  451. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/conftest.py +0 -0
  452. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/__init__.py +0 -0
  453. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/coco.py +0 -0
  454. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/categorized/test/annotations.json +0 -0
  455. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/categorized/test/new_dm_data8.jpg +0 -0
  456. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/categorized/test/new_dm_data9.jpg +0 -0
  457. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/categorized/train/annotations.json +0 -0
  458. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/categorized/train/new_dm_data4.jpg +0 -0
  459. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/categorized/train/new_dm_data5.jpg +0 -0
  460. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/categorized/train/new_dm_data6.jpg +0 -0
  461. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/categorized/valid/annotations.json +0 -0
  462. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/categorized/valid/new_dm_data7.jpg +0 -0
  463. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/not_categorized/annotations.json +0 -0
  464. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/not_categorized/new_dm_data1.jpg +0 -0
  465. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/not_categorized/new_dm_data2.jpg +0 -0
  466. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/coco/not_categorized/new_dm_data3.jpg +0 -0
  467. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/json/dm_1.json +0 -0
  468. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/json/dm_2.json +0 -0
  469. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/json/dm_3.json +0 -0
  470. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/original_files/dm_1.jpg +0 -0
  471. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/original_files/dm_2.jpg +0 -0
  472. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/test/original_files/dm_3.jpg +0 -0
  473. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/json/dm_4.json +0 -0
  474. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/json/dm_5.json +0 -0
  475. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/json/dm_6.json +0 -0
  476. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/json/dm_7.json +0 -0
  477. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/original_files/dm_4.jpg +0 -0
  478. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/original_files/dm_5.jpg +0 -0
  479. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/original_files/dm_6.jpg +0 -0
  480. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/train/original_files/dm_7.jpg +0 -0
  481. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/valid/json/dm_8.json +0 -0
  482. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/valid/json/dm_9.json +0 -0
  483. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/valid/original_files/dm_8.jpg +0 -0
  484. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/categorized/valid/original_files/dm_9.jpg +0 -0
  485. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/json/dm_1.json +0 -0
  486. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/json/dm_2.json +0 -0
  487. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/json/dm_3.json +0 -0
  488. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/original_files/dm_1.jpg +0 -0
  489. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/original_files/dm_2.jpg +0 -0
  490. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/not_categorized/original_files/dm_3.jpg +0 -0
  491. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/ver1/json/25669.json +0 -0
  492. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/dm/ver2/json/25669.json +0 -0
  493. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/classes.txt +0 -0
  494. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Annotations/9139.xml +0 -0
  495. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Annotations/9140.xml +0 -0
  496. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Annotations/9141.xml +0 -0
  497. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Images/9139.jpg +0 -0
  498. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Images/9140.jpg +0 -0
  499. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/test/Images/9141.jpg +0 -0
  500. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Annotations/9136.xml +0 -0
  501. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Annotations/9137.xml +0 -0
  502. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Annotations/9138.xml +0 -0
  503. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Images/9136.jpg +0 -0
  504. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Images/9137.jpg +0 -0
  505. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/train/Images/9138.jpg +0 -0
  506. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Annotations/9125.xml +0 -0
  507. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Annotations/9126.xml +0 -0
  508. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Annotations/9127.xml +0 -0
  509. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Images/9125.jpg +0 -0
  510. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Images/9126.jpg +0 -0
  511. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/categorized/valid/Images/9127.jpg +0 -0
  512. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Annotations/9122.xml +0 -0
  513. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Annotations/9123.xml +0 -0
  514. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Annotations/9124.xml +0 -0
  515. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Images/9122.jpg +0 -0
  516. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Images/9123.jpg +0 -0
  517. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/Images/9124.jpg +0 -0
  518. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/pascal/not_categorized/classes.txt +0 -0
  519. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/dataset.yaml +0 -0
  520. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/images/13744.jpg +0 -0
  521. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/images/13745.jpg +0 -0
  522. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/images/13746.jpg +0 -0
  523. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/labels/13744.txt +0 -0
  524. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/labels/13745.txt +0 -0
  525. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/test/labels/13746.txt +0 -0
  526. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/train/images/13782.jpg +0 -0
  527. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/train/labels/13782.txt +0 -0
  528. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/valid/images/13761.jpg +0 -0
  529. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/valid/images/13764.jpg +0 -0
  530. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/valid/labels/13761.txt +0 -0
  531. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/categorized/valid/labels/13764.txt +0 -0
  532. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/classes.txt +0 -0
  533. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/dataset.yaml +0 -0
  534. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/images/25332.jpg +0 -0
  535. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/images/25334.jpg +0 -0
  536. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/labels/25332.txt +0 -0
  537. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/image/yolo/not_categorized/labels/25334.txt +0 -0
  538. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/pcd/dm/ver1/json/23791.json +0 -0
  539. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/pcd/dm/ver2/json/23791.json +0 -0
  540. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/prompt/dm/ver1/json/18662.json +0 -0
  541. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/prompt/dm/ver2/json/18662.json +0 -0
  542. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/text/dm/ver1/json/23811.json +0 -0
  543. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/text/dm/ver2/json/23811.json +0 -0
  544. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/video/dm/ver1/json/23831.json +0 -0
  545. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/data_types/video/dm/ver2/json/23831.json +0 -0
  546. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/dm_schema.py +0 -0
  547. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/pascal.py +0 -0
  548. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/fixtures/yolo.py +0 -0
  549. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/test_coco_from_dm.py +0 -0
  550. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/test_coco_to_dm.py +0 -0
  551. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/test_dm_v1_to_v2.py +0 -0
  552. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/test_dm_v2_to_v1.py +0 -0
  553. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/test_pascal_from_dm.py +0 -0
  554. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/test_pascal_to_dm.py +0 -0
  555. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/test_yolo_from_dm.py +0 -0
  556. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/converters/test_yolo_to_dm.py +0 -0
  557. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/file/__init__.py +0 -0
  558. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/file/test_archive.py +0 -0
  559. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/file/test_checksum.py +0 -0
  560. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/file/test_chunking.py +0 -0
  561. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/file/test_download.py +0 -0
  562. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/file/test_encoding.py +0 -0
  563. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/file/test_io.py +0 -0
  564. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/file/test_video_transcode.py +0 -0
  565. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/storage/conftest.py +0 -0
  566. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/storage/test_file_system_storage.py +0 -0
  567. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/storage/test_provider_selection.py +0 -0
  568. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/test_debug.py +0 -0
  569. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/tests/utils/test_network.py +0 -0
  570. {synapse_sdk-2025.10.4 → synapse_sdk-2025.10.5}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synapse-sdk
3
- Version: 2025.10.4
3
+ Version: 2025.10.5
4
4
  Summary: synapse sdk
5
5
  Author-email: datamaker <developer@datamaker.io>
6
6
  License: MIT
@@ -97,6 +97,31 @@ Each asset has its own path and recursive setting. Perfect for distributed data
97
97
  }
98
98
  ```
99
99
 
100
+ **Optional File Specs:**
101
+
102
+ In multi-path mode, file specifications can be marked as optional in the data collection's file specification template:
103
+
104
+ - **Required specs** (`is_required: true`): Must have an asset path in the `assets` parameter
105
+ - **Optional specs** (`is_required: false`): Can be omitted from `assets` - the system will skip them
106
+
107
+ Example with optional spec omitted:
108
+
109
+ ```json
110
+ {
111
+ "name": "Multi-Source Upload",
112
+ "use_single_path": false,
113
+ "assets": {
114
+ "pcd_1": {"path": "/sensors/lidar", "is_recursive": false},
115
+ "image_1": {"path": "/cameras/front", "is_recursive": true}
116
+ // "json_meta_1" is optional and omitted
117
+ },
118
+ "storage": 1,
119
+ "data_collection": 5
120
+ }
121
+ ```
122
+
123
+ The system logs: `"Skipping optional spec json_meta_1: no asset path configured"`
124
+
100
125
  ## Basic Usage
101
126
 
102
127
  ### CLI Usage
@@ -97,6 +97,31 @@ sidebar_position: 1
97
97
  }
98
98
  ```
99
99
 
100
+ **선택적 파일 사양:**
101
+
102
+ 다중 경로 모드에서는 데이터 컬렉션의 파일 사양 템플릿에서 파일 사양을 선택적으로 표시할 수 있습니다:
103
+
104
+ - **필수 사양** (`is_required: true`): `assets` 매개변수에 자산 경로가 반드시 있어야 합니다
105
+ - **선택적 사양** (`is_required: false`): `assets`에서 생략 가능 - 시스템이 건너뜁니다
106
+
107
+ 선택적 사양이 생략된 예제:
108
+
109
+ ```json
110
+ {
111
+ "name": "다중 소스 업로드",
112
+ "use_single_path": false,
113
+ "assets": {
114
+ "pcd_1": {"path": "/sensors/lidar", "is_recursive": false},
115
+ "image_1": {"path": "/cameras/front", "is_recursive": true}
116
+ // "json_meta_1"은 선택사항이며 생략됨
117
+ },
118
+ "storage": 1,
119
+ "data_collection": 5
120
+ }
121
+ ```
122
+
123
+ 시스템 로그: `"Skipping optional spec json_meta_1: no asset path configured"`
124
+
100
125
  ## 기본 사용법
101
126
 
102
127
  ### CLI 사용법
@@ -173,11 +173,18 @@ class UploadAction(Action):
173
173
  organized_files = context.get('organized_files', [])
174
174
  file_specification_template = context.get('file_specification_template', {})
175
175
  pathlib_cwd = context.get('pathlib_cwd')
176
+ use_single_path = context.get_param('use_single_path', True)
176
177
 
177
- if not organized_files or not file_specification_template or not pathlib_cwd:
178
+ # Validate required data based on mode
179
+ if not organized_files or not file_specification_template:
178
180
  raise ActionError('Required data not available from workflow steps')
179
181
 
182
+ # In single-path mode, pathlib_cwd is required
183
+ if use_single_path and not pathlib_cwd:
184
+ raise ActionError('pathlib_cwd is required in single-path mode')
185
+
180
186
  # CRITICAL: Integrate with existing uploader mechanism
187
+ # In multi-path mode, pathlib_cwd may be None, but uploader should still work
181
188
  uploader = self.get_uploader(pathlib_cwd, file_specification_template, organized_files, self.params)
182
189
  organized_files = uploader.handle_upload_files()
183
190
 
@@ -87,7 +87,6 @@ class UploadContext:
87
87
  'generated_data_units_count': len(self.data_units),
88
88
  'success': len(self.errors) == 0,
89
89
  'errors': self.errors,
90
- 'metrics': self.metrics,
91
90
  }
92
91
 
93
92
  def has_errors(self) -> bool:
@@ -31,7 +31,9 @@ class GenerateDataUnitsStep(BaseStep):
31
31
  context.run.log_message_with_code(LogCode.GENERATING_DATA_UNITS)
32
32
 
33
33
  # Initialize metrics
34
- context.update_metrics('data_units', {'stand_by': upload_result_count, 'success': 0, 'failed': 0})
34
+ initial_metrics = {'stand_by': upload_result_count, 'success': 0, 'failed': 0}
35
+ context.update_metrics('data_units', initial_metrics)
36
+ context.run.set_metrics(initial_metrics, category='data_units')
35
37
 
36
38
  # Get batch size from parameters
37
39
  batch_size = context.get_param('creating_data_unit_batch_size', 1)
@@ -49,7 +51,9 @@ class GenerateDataUnitsStep(BaseStep):
49
51
  )
50
52
 
51
53
  # Update final metrics
52
- context.update_metrics('data_units', {'stand_by': 0, 'success': len(generated_data_units), 'failed': 0})
54
+ final_metrics = {'stand_by': 0, 'success': len(generated_data_units), 'failed': 0}
55
+ context.update_metrics('data_units', final_metrics)
56
+ context.run.set_metrics(final_metrics, category='data_units')
53
57
 
54
58
  # Complete progress
55
59
  context.run.set_progress(upload_result_count, upload_result_count, category='generate_data_units')
@@ -29,19 +29,34 @@ class InitializeStep(BaseStep):
29
29
  except Exception as e:
30
30
  return self.create_error_result(f'Failed to get storage {storage_id}: {str(e)}')
31
31
 
32
- # Get and validate path
32
+ # Check if we're in multi-path mode
33
+ use_single_path = context.get_param('use_single_path', True)
34
+
35
+ # Get and validate path (only required in single-path mode)
33
36
  path = context.get_param('path')
34
- if path is None:
35
- return self.create_error_result('Path parameter is required')
37
+ pathlib_cwd = None
36
38
 
37
- try:
38
- pathlib_cwd = get_pathlib(storage, path)
39
- context.set_pathlib_cwd(pathlib_cwd)
40
- except Exception as e:
41
- return self.create_error_result(f'Failed to get path {path}: {str(e)}')
39
+ if use_single_path:
40
+ # Single-path mode: global path is required
41
+ if path is None:
42
+ return self.create_error_result('Path parameter is required in single-path mode')
43
+
44
+ try:
45
+ pathlib_cwd = get_pathlib(storage, path)
46
+ context.set_pathlib_cwd(pathlib_cwd)
47
+ except Exception as e:
48
+ return self.create_error_result(f'Failed to get path {path}: {str(e)}')
49
+ else:
50
+ # Multi-path mode: global path is optional (each asset has its own path)
51
+ if path:
52
+ try:
53
+ pathlib_cwd = get_pathlib(storage, path)
54
+ context.set_pathlib_cwd(pathlib_cwd)
55
+ except Exception as e:
56
+ return self.create_error_result(f'Failed to get path {path}: {str(e)}')
42
57
 
43
58
  # Return success with rollback data
44
- rollback_data = {'storage_id': storage_id, 'path': path}
59
+ rollback_data = {'storage_id': storage_id, 'path': path, 'use_single_path': use_single_path}
45
60
 
46
61
  return self.create_success_result(
47
62
  data={'storage': storage, 'pathlib_cwd': pathlib_cwd}, rollback_data=rollback_data
@@ -61,9 +61,15 @@ class ProcessMetadataStep(BaseStep):
61
61
  excel_metadata = metadata_strategy.extract(excel_path)
62
62
  else:
63
63
  # Look for default metadata files (meta.xlsx, meta.xls)
64
- excel_path = self._find_excel_metadata_file(context.pathlib_cwd)
65
- if excel_path:
66
- excel_metadata = metadata_strategy.extract(excel_path)
64
+ # Only possible in single-path mode where pathlib_cwd is set
65
+ if context.pathlib_cwd:
66
+ excel_path = self._find_excel_metadata_file(context.pathlib_cwd)
67
+ if excel_path:
68
+ excel_metadata = metadata_strategy.extract(excel_path)
69
+ else:
70
+ context.run.log_message(
71
+ 'No Excel metadata specified and multi-path mode - skipping metadata processing'
72
+ )
67
73
 
68
74
  # Validate extracted metadata
69
75
  if excel_metadata:
@@ -136,9 +142,13 @@ class ProcessMetadataStep(BaseStep):
136
142
  if path.exists() and path.is_file():
137
143
  return path, False
138
144
 
139
- # Try relative to cwd
140
- path = context.pathlib_cwd / excel_path_str
141
- return (path, False) if path.exists() else (None, False)
145
+ # Try relative to cwd (only if pathlib_cwd is set)
146
+ if context.pathlib_cwd:
147
+ path = context.pathlib_cwd / excel_path_str
148
+ return (path, False) if path.exists() else (None, False)
149
+
150
+ # In multi-path mode without pathlib_cwd, can only use absolute paths
151
+ return (None, False)
142
152
 
143
153
  def _resolve_excel_path_from_base64(
144
154
  self, excel_config: dict | ExcelMetadataFile, context: UploadContext
@@ -179,7 +189,17 @@ class ProcessMetadataStep(BaseStep):
179
189
  return None, False
180
190
 
181
191
  def _find_excel_metadata_file(self, pathlib_cwd: Path) -> Path:
182
- """Find default Excel metadata file."""
192
+ """Find default Excel metadata file.
193
+
194
+ Args:
195
+ pathlib_cwd: Working directory path (must not be None)
196
+
197
+ Returns:
198
+ Path to Excel metadata file, or None if not found
199
+ """
200
+ if not pathlib_cwd:
201
+ return None
202
+
183
203
  # Check .xlsx first as it's more common
184
204
  excel_path = pathlib_cwd / 'meta.xlsx'
185
205
  if excel_path.exists():
@@ -90,25 +90,40 @@ class OrganizeFilesStep(BaseStep):
90
90
  if not assets:
91
91
  return self.create_error_result('Multi-path mode requires assets configuration')
92
92
 
93
+ # Validate that all required specs have asset paths
94
+ required_specs = [spec['name'] for spec in context.file_specifications if spec.get('is_required', False)]
95
+ missing_required = [spec for spec in required_specs if spec not in assets]
96
+
97
+ if missing_required:
98
+ return self.create_error_result(
99
+ f'Multi-path mode requires asset paths for required specs: {", ".join(missing_required)}'
100
+ )
101
+
93
102
  context.run.log_message(f'Using multi-path mode with {len(assets)} asset configurations')
94
103
  context.run.log_message_with_code(LogCode.FILE_ORGANIZATION_STARTED)
95
104
 
96
- all_organized_files = []
105
+ # Collect all files and specs first
106
+ all_files = []
97
107
  type_dirs = {}
108
+ specs_with_files = []
98
109
 
99
110
  for spec in context.file_specifications:
100
111
  spec_name = spec['name']
112
+ is_required = spec.get('is_required', False)
101
113
 
102
- # Skip if no asset configuration for this spec
114
+ # Skip if no asset configuration for this spec (only allowed for optional specs)
103
115
  if spec_name not in assets:
104
- context.run.log_message(f'Skipping {spec_name}: no asset path configured')
116
+ if is_required:
117
+ # This should not happen due to validation above, but double-check
118
+ return self.create_error_result(f'Required spec {spec_name} missing asset path')
119
+ context.run.log_message(f'Skipping optional spec {spec_name}: no asset path configured')
105
120
  continue
106
121
 
107
122
  asset_config = assets[spec_name]
108
123
 
109
124
  # Get the asset path from storage
110
125
  try:
111
- asset_path = get_pathlib(context.storage, asset_config.path)
126
+ asset_path = get_pathlib(context.storage, asset_config.get('path', ''))
112
127
  type_dirs[spec_name] = asset_path
113
128
  except Exception as e:
114
129
  context.run.log_message(f'Error accessing path for {spec_name}: {str(e)}', 'WARNING')
@@ -119,9 +134,9 @@ class OrganizeFilesStep(BaseStep):
119
134
  continue
120
135
 
121
136
  # Discover files for this asset
122
- is_recursive = asset_config.is_recursive
137
+ is_recursive = asset_config.get('is_recursive', True)
123
138
  context.run.log_message(
124
- f'Discovering files for {spec_name} at {asset_config.path} (recursive={is_recursive})'
139
+ f'Discovering files for {spec_name} at {asset_config.get("path", "")} (recursive={is_recursive})'
125
140
  )
126
141
 
127
142
  files = file_discovery_strategy.discover(asset_path, is_recursive)
@@ -130,14 +145,23 @@ class OrganizeFilesStep(BaseStep):
130
145
  context.run.log_message(f'No files found for {spec_name}', 'WARNING')
131
146
  continue
132
147
 
133
- # Organize files for this specific spec
134
- organized = file_discovery_strategy.organize(files, [spec], context.metadata or {}, {spec_name: asset_path})
148
+ all_files.extend(files)
149
+ specs_with_files.append(spec)
150
+ context.run.log_message(f'Found {len(files)} files for {spec_name}')
135
151
 
136
- all_organized_files.extend(organized)
137
- context.run.log_message(f'Found {len(organized)} files for {spec_name}')
152
+ # Organize all files together to group by dataset_key
153
+ all_organized_files = []
154
+ if all_files and specs_with_files:
155
+ context.run.log_message(f'Organizing {len(all_files)} files across {len(specs_with_files)} specs')
156
+ context.run.log_message(f'Type directories: {list(type_dirs.keys())}')
157
+
158
+ all_organized_files = file_discovery_strategy.organize(
159
+ all_files, specs_with_files, context.metadata or {}, type_dirs
160
+ )
138
161
 
139
162
  if all_organized_files:
140
163
  context.run.log_message_with_code(LogCode.FILES_DISCOVERED, len(all_organized_files))
164
+ context.run.log_message(f'Created {len(all_organized_files)} data units from {len(all_files)} files')
141
165
  context.add_organized_files(all_organized_files)
142
166
  else:
143
167
  context.run.log_message_with_code(LogCode.NO_FILES_FOUND_WARNING)
@@ -159,8 +183,17 @@ class OrganizeFilesStep(BaseStep):
159
183
 
160
184
  def validate_prerequisites(self, context: UploadContext) -> None:
161
185
  """Validate prerequisites for file organization."""
162
- if not context.pathlib_cwd:
163
- raise ValueError('Working directory path not set')
186
+ use_single_path = context.get_param('use_single_path', True)
187
+
188
+ # In single-path mode, pathlib_cwd is required
189
+ if use_single_path and not context.pathlib_cwd:
190
+ raise ValueError('Working directory path not set in single-path mode')
191
+
192
+ # In multi-path mode, pathlib_cwd is optional (each asset has its own path)
193
+ if not use_single_path:
194
+ assets = context.get_param('assets', {})
195
+ if not assets:
196
+ raise ValueError('Multi-path mode requires assets configuration')
164
197
 
165
198
  if not context.file_specifications:
166
199
  raise ValueError('File specifications not available')
@@ -34,7 +34,9 @@ class UploadFilesStep(BaseStep):
34
34
  context.run.log_message_with_code(LogCode.UPLOADING_DATA_FILES)
35
35
 
36
36
  # Initialize metrics
37
- context.update_metrics('data_files', {'stand_by': organized_files_count, 'success': 0, 'failed': 0})
37
+ initial_metrics = {'stand_by': organized_files_count, 'success': 0, 'failed': 0}
38
+ context.update_metrics('data_files', initial_metrics)
39
+ context.run.set_metrics(initial_metrics, category='data_files')
38
40
 
39
41
  # Create upload configuration
40
42
  upload_config = UploadConfig(
@@ -55,10 +57,13 @@ class UploadFilesStep(BaseStep):
55
57
  context.run.log_data_file(uploaded_file, UploadStatus.SUCCESS)
56
58
 
57
59
  # Update final metrics
58
- context.update_metrics(
59
- 'data_files',
60
- {'stand_by': 0, 'success': len(uploaded_files), 'failed': organized_files_count - len(uploaded_files)},
61
- )
60
+ final_metrics = {
61
+ 'stand_by': 0,
62
+ 'success': len(uploaded_files),
63
+ 'failed': organized_files_count - len(uploaded_files),
64
+ }
65
+ context.update_metrics('data_files', final_metrics)
66
+ context.run.set_metrics(final_metrics, category='data_files')
62
67
 
63
68
  # Complete progress
64
69
  context.run.set_progress(organized_files_count, organized_files_count, category='upload_data_files')
@@ -10,7 +10,11 @@ class FlatFileDiscoveryStrategy(FileDiscoveryStrategy):
10
10
 
11
11
  def discover(self, path: Path, recursive: bool) -> List[Path]:
12
12
  """Discover files non-recursively in the given path."""
13
- return [file_path for file_path in path.glob('*') if file_path.is_file()]
13
+ # Exclude system files
14
+ excluded_files = {'.DS_Store', 'Thumbs.db', 'desktop.ini'}
15
+ return [
16
+ file_path for file_path in path.glob('*') if file_path.is_file() and file_path.name not in excluded_files
17
+ ]
14
18
 
15
19
  def organize(self, files: List[Path], specs: Dict, metadata: Dict, type_dirs: Dict = None) -> List[Dict]:
16
20
  """Organize files according to specifications with metadata."""
@@ -39,9 +43,14 @@ class FlatFileDiscoveryStrategy(FileDiscoveryStrategy):
39
43
  # Performance optimization 2: Build metadata index for faster lookups
40
44
  metadata_index = self._build_metadata_index(metadata)
41
45
 
42
- # Group files by dataset (flat discovery)
46
+ # Group files by dataset_key (stem-based matching) - flat discovery (no subdirectories)
47
+ # Strategy:
48
+ # 1. Group all files (required + optional) by their file stem
49
+ # 2. Only create data units for groups that have ALL required files
50
+ # 3. Optional files are automatically included if they match the stem
43
51
  dataset_files = {}
44
52
  required_specs = [spec['name'] for spec in specs if spec.get('is_required', False)]
53
+ optional_specs = [spec['name'] for spec in specs if not spec.get('is_required', False)]
45
54
 
46
55
  for file_path in files:
47
56
  # Determine which type directory this file belongs to
@@ -64,20 +73,36 @@ class FlatFileDiscoveryStrategy(FileDiscoveryStrategy):
64
73
  # If stat fails, keep existing file
65
74
  pass
66
75
 
67
- # Create organized files for datasets with all required files
76
+ # Create organized files ONLY for datasets with ALL required files
77
+ # Optional files are included automatically if they match the stem
68
78
  for file_name, files_dict in sorted(dataset_files.items()):
69
- if all(req in files_dict for req in required_specs):
70
- # Calculate most common file extension (optimized)
79
+ # Check if all required files are present
80
+ has_all_required = all(req in files_dict for req in required_specs)
81
+
82
+ if has_all_required:
83
+ # Extract original file stem from actual file paths (more reliable)
84
+ # Collect stems from all files in the group
85
+ file_stems = {}
71
86
  file_extensions = {}
87
+
72
88
  for file_path in files_dict.values():
89
+ stem = file_path.stem
73
90
  ext = file_path.suffix.lower()
91
+
92
+ # Count stems (to handle multiple files with slightly different names)
93
+ if stem:
94
+ file_stems[stem] = file_stems.get(stem, 0) + 1
95
+
96
+ # Count extensions
74
97
  if ext:
75
98
  file_extensions[ext] = file_extensions.get(ext, 0) + 1
76
99
 
100
+ # Use the most common stem (usually they're all the same)
101
+ original_stem = max(file_stems, key=file_stems.get) if file_stems else file_name
77
102
  origin_file_extension = max(file_extensions, key=file_extensions.get) if file_extensions else ''
78
103
 
79
104
  meta_data = {
80
- 'origin_file_stem': file_name,
105
+ 'origin_file_stem': original_stem,
81
106
  'origin_file_extension': origin_file_extension,
82
107
  'created_at': datetime.now().isoformat(),
83
108
  }
@@ -10,7 +10,14 @@ class RecursiveFileDiscoveryStrategy(FileDiscoveryStrategy):
10
10
 
11
11
  def discover(self, path: Path, recursive: bool) -> List[Path]:
12
12
  """Discover files recursively in the given path."""
13
- return [file_path for file_path in path.rglob('*') if file_path.is_file()]
13
+ # Exclude system directories
14
+ excluded_dirs = {'@eaDir', '.@__thumb', '@Recycle', '#recycle', '.DS_Store', 'Thumbs.db', '.synology'}
15
+
16
+ def exclude_dirs(file_path: Path) -> bool:
17
+ """Check if file path contains excluded directories."""
18
+ return any(excluded_dir in file_path.parts for excluded_dir in excluded_dirs)
19
+
20
+ return [file_path for file_path in path.rglob('*') if file_path.is_file() and not exclude_dirs(file_path)]
14
21
 
15
22
  def organize(self, files: List[Path], specs: Dict, metadata: Dict, type_dirs: Dict = None) -> List[Dict]:
16
23
  """Organize files according to specifications with metadata."""
@@ -42,57 +49,78 @@ class RecursiveFileDiscoveryStrategy(FileDiscoveryStrategy):
42
49
  # Performance optimization 2: Build metadata index for faster lookups
43
50
  metadata_index = self._build_metadata_index(metadata)
44
51
 
45
- # Group files by dataset
52
+ # Group files by dataset_key (stem-based matching)
53
+ # Strategy:
54
+ # 1. Group all files (required + optional) by their file stem
55
+ # 2. Only create data units for groups that have ALL required files
56
+ # 3. Optional files are automatically included if they match the stem
46
57
  dataset_files = {}
47
58
  required_specs = [spec['name'] for spec in specs if spec.get('is_required', False)]
48
59
 
49
60
  for file_path in files:
50
61
  # Determine which type directory this file belongs to
51
- file_path_str = str(file_path)
62
+ matched = False
52
63
  for spec_name, dir_path in type_dirs.items():
53
- dir_path_str = path_cache[dir_path]
54
- if file_path_str.startswith(dir_path_str):
55
- # Create unique dataset key using relative path from spec directory
64
+ # Check if file is under this spec's directory
65
+ # Use try/except for relative_to to ensure proper path matching
66
+ try:
56
67
  relative_path = file_path.relative_to(dir_path)
57
- # Use parent directory + stem as unique key to group related files
58
- if relative_path.parent != Path('.'):
59
- dataset_key = f'{relative_path.parent}_{file_path.stem}'
60
- else:
61
- dataset_key = file_path.stem
62
-
63
- if dataset_key not in dataset_files:
64
- dataset_files[dataset_key] = {}
65
-
66
- if spec_name not in dataset_files[dataset_key]:
67
- dataset_files[dataset_key][spec_name] = file_path
68
- else:
69
- # Keep the most recent file - only stat when needed
70
- existing_file = dataset_files[dataset_key][spec_name]
71
- try:
72
- if file_path.stat().st_mtime > existing_file.stat().st_mtime:
73
- dataset_files[dataset_key][spec_name] = file_path
74
- except (OSError, IOError):
75
- # If stat fails, keep existing file
76
- pass
77
-
78
- # Create organized files for datasets with all required files
79
- for dataset_key, files_dict in sorted(dataset_files.items()):
80
- if all(req in files_dict for req in required_specs):
81
- # Extract original file stem from dataset_key
82
- # If dataset_key contains path info (parent_stem), extract just the stem part
83
- if '_' in dataset_key and len(dataset_key.split('_')) >= 2:
84
- # Extract the last part after the last underscore as the original stem
85
- original_stem = dataset_key.split('_')[-1]
68
+ matched = True
69
+ except ValueError:
70
+ # File is not under this directory
71
+ continue
72
+
73
+ # Create unique dataset key using relative path from spec directory
74
+ # Use parent directory + stem as unique key to group related files
75
+ if relative_path.parent != Path('.'):
76
+ dataset_key = f'{relative_path.parent}_{file_path.stem}'
77
+ else:
78
+ dataset_key = file_path.stem
79
+
80
+ if dataset_key not in dataset_files:
81
+ dataset_files[dataset_key] = {}
82
+
83
+ if spec_name not in dataset_files[dataset_key]:
84
+ dataset_files[dataset_key][spec_name] = file_path
86
85
  else:
87
- original_stem = dataset_key
86
+ # Keep the most recent file - only stat when needed
87
+ existing_file = dataset_files[dataset_key][spec_name]
88
+ try:
89
+ if file_path.stat().st_mtime > existing_file.stat().st_mtime:
90
+ dataset_files[dataset_key][spec_name] = file_path
91
+ except (OSError, IOError):
92
+ # If stat fails, keep existing file
93
+ pass
94
+
95
+ # Found matching directory, move to next file
96
+ break
97
+
98
+ # Create organized files ONLY for datasets with ALL required files
99
+ # Optional files are included automatically if they match the stem
100
+ for dataset_key, files_dict in sorted(dataset_files.items()):
101
+ # Check if all required files are present
102
+ has_all_required = all(req in files_dict for req in required_specs)
88
103
 
89
- # Calculate most common file extension (optimized)
104
+ if has_all_required:
105
+ # Extract original file stem from actual file paths (more reliable than parsing dataset_key)
106
+ # Collect stems from all files in the group
107
+ file_stems = {}
90
108
  file_extensions = {}
109
+
91
110
  for file_path in files_dict.values():
111
+ stem = file_path.stem
92
112
  ext = file_path.suffix.lower()
113
+
114
+ # Count stems (to handle multiple files with slightly different names)
115
+ if stem:
116
+ file_stems[stem] = file_stems.get(stem, 0) + 1
117
+
118
+ # Count extensions
93
119
  if ext:
94
120
  file_extensions[ext] = file_extensions.get(ext, 0) + 1
95
121
 
122
+ # Use the most common stem (usually they're all the same)
123
+ original_stem = max(file_stems, key=file_stems.get) if file_stems else dataset_key
96
124
  origin_file_extension = max(file_extensions, key=file_extensions.get) if file_extensions else ''
97
125
 
98
126
  meta_data = {
@@ -12,12 +12,24 @@ class DefaultValidationStrategy(ValidationStrategy):
12
12
  """Validate action parameters."""
13
13
  errors = []
14
14
 
15
- # Check required parameters
16
- required_params = ['storage', 'data_collection', 'path', 'name']
15
+ # Check required parameters (common to all modes)
16
+ required_params = ['storage', 'data_collection', 'name']
17
17
  for param in required_params:
18
18
  if param not in params:
19
19
  errors.append(f'Missing required parameter: {param}')
20
20
 
21
+ # Check mode-specific requirements
22
+ use_single_path = params.get('use_single_path', True)
23
+
24
+ if use_single_path:
25
+ # Single-path mode: 'path' is required
26
+ if 'path' not in params:
27
+ errors.append("Missing required parameter 'path' in single-path mode")
28
+ else:
29
+ # Multi-path mode: 'assets' is required
30
+ if 'assets' not in params:
31
+ errors.append("Missing required parameter 'assets' in multi-path mode")
32
+
21
33
  # Check parameter types
22
34
  if 'storage' in params and not isinstance(params['storage'], int):
23
35
  errors.append("Parameter 'storage' must be an integer")
@@ -28,6 +40,9 @@ class DefaultValidationStrategy(ValidationStrategy):
28
40
  if 'is_recursive' in params and not isinstance(params['is_recursive'], bool):
29
41
  errors.append("Parameter 'is_recursive' must be a boolean")
30
42
 
43
+ if 'use_single_path' in params and not isinstance(params['use_single_path'], bool):
44
+ errors.append("Parameter 'use_single_path' must be a boolean")
45
+
31
46
  return ValidationResult(valid=len(errors) == 0, errors=errors)
32
47
 
33
48
  def validate_files(self, files: List[Dict], specs: Dict) -> ValidationResult:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synapse-sdk
3
- Version: 2025.10.4
3
+ Version: 2025.10.5
4
4
  Summary: synapse sdk
5
5
  Author-email: datamaker <developer@datamaker.io>
6
6
  License: MIT
@@ -441,6 +441,7 @@ tests/plugins/upload/integration/__init__.py
441
441
  tests/plugins/upload/integration/test_workflow.py
442
442
  tests/plugins/upload/steps/__init__.py
443
443
  tests/plugins/upload/strategies/__init__.py
444
+ tests/plugins/upload/strategies/test_file_discovery.py
444
445
  tests/plugins/utils/__init__.py
445
446
  tests/plugins/utils/test_actions.py
446
447
  tests/plugins/utils/test_config.py