sycommon-python-lib 0.2.1a40__tar.gz → 0.2.1a41__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/http_sandbox_backend.py +52 -7
  4. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  5. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/README.md +0 -0
  6. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/setup.cfg +0 -0
  7. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/__init__.py +0 -0
  8. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/cli.py +0 -0
  9. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/core/__init__.py +0 -0
  10. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/core/console.py +0 -0
  11. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/core/models.py +0 -0
  12. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/core/project.py +0 -0
  13. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/core/utils.py +0 -0
  14. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/templates/__init__.py +0 -0
  15. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/templates/agent/__init__.py +0 -0
  16. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/templates/base/__init__.py +0 -0
  17. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/command/templates/web/__init__.py +0 -0
  18. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/__init__.py +0 -0
  19. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/__init__.py +0 -0
  20. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/agent_manager.py +0 -0
  21. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/chat_events.py +0 -0
  22. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/deep_agent.py +0 -0
  23. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/multi_agent_team.py +0 -0
  24. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/__init__.py +0 -0
  25. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  26. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  27. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  28. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/session.py +0 -0
  29. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/auth/__init__.py +0 -0
  30. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/auth/ldap_service.py +0 -0
  31. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/Config.py +0 -0
  32. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/DatabaseConfig.py +0 -0
  33. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  34. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/EmbeddingConfig.py +0 -0
  35. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/LLMConfig.py +0 -0
  36. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/LangfuseConfig.py +0 -0
  37. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/MQConfig.py +0 -0
  38. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/RedisConfig.py +0 -0
  39. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/RerankerConfig.py +0 -0
  40. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/SentryConfig.py +0 -0
  41. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/__init__.py +0 -0
  42. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/async_base_db_service.py +0 -0
  43. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/async_database_service.py +0 -0
  44. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/base_db_service.py +0 -0
  45. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/database_service.py +0 -0
  46. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/elasticsearch_service.py +0 -0
  47. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/redis_service.py +0 -0
  48. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/token_usage_db_service.py +0 -0
  49. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/health/__init__.py +0 -0
  50. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/health/health_check.py +0 -0
  51. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/health/metrics.py +0 -0
  52. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/health/ping.py +0 -0
  53. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/heartbeat_process/__init__.py +0 -0
  54. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  55. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  56. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  57. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/__init__.py +0 -0
  58. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/embedding.py +0 -0
  59. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/get_llm.py +0 -0
  60. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/llm_logger.py +0 -0
  61. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/llm_tokens.py +0 -0
  62. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  63. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  64. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  65. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/struct_token.py +0 -0
  66. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/sy_langfuse.py +0 -0
  67. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/token_usage_es_service.py +0 -0
  68. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  69. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/usage_token.py +0 -0
  70. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/__init__.py +0 -0
  71. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/async_sql_logger.py +0 -0
  72. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/kafka_log.py +0 -0
  73. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/logger_levels.py +0 -0
  74. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/logger_wrapper.py +0 -0
  75. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/process_logger.py +0 -0
  76. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/sql_logger.py +0 -0
  77. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/__init__.py +0 -0
  78. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/background_execution.py +0 -0
  79. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/context.py +0 -0
  80. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/cors.py +0 -0
  81. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/docs.py +0 -0
  82. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/exception.py +0 -0
  83. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/middleware.py +0 -0
  84. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/monitor_memory.py +0 -0
  85. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/mq.py +0 -0
  86. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/sandbox.py +0 -0
  87. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/timeout.py +0 -0
  88. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/traceid.py +0 -0
  89. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/__init__.py +0 -0
  90. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/base_http.py +0 -0
  91. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/log.py +0 -0
  92. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/mqlistener_config.py +0 -0
  93. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/mqmsg_model.py +0 -0
  94. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/mqsend_config.py +0 -0
  95. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/sandbox.py +0 -0
  96. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/sso_user.py +0 -0
  97. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/token_usage.py +0 -0
  98. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/token_usage_mysql.py +0 -0
  99. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/notice/__init__.py +0 -0
  100. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  101. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  102. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  103. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  104. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  105. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  106. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  107. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  108. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  109. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  110. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/sentry/__init__.py +0 -0
  111. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/sentry/sy_sentry.py +0 -0
  112. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/services.py +0 -0
  113. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/sse/__init__.py +0 -0
  114. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/sse/event.py +0 -0
  115. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/sse/sse.py +0 -0
  116. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/__init__.py +0 -0
  117. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/example.py +0 -0
  118. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/example2.py +0 -0
  119. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/feign.py +0 -0
  120. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/feign_client.py +0 -0
  121. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_client_base.py +0 -0
  122. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  123. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  124. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_service.py +0 -0
  125. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  126. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  127. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/param.py +0 -0
  128. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tests/deep_agent_server.py +0 -0
  129. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tests/test_deep_agent.py +0 -0
  130. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tests/test_email.py +0 -0
  131. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tests/test_mq.py +0 -0
  132. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/__init__.py +0 -0
  133. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/async_utils.py +0 -0
  134. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/docs.py +0 -0
  135. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/env.py +0 -0
  136. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/merge_headers.py +0 -0
  137. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/snowflake.py +0 -0
  138. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/syemail.py +0 -0
  139. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/timing.py +0 -0
  140. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -0
  141. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  142. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  143. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  144. {sycommon_python_lib-0.2.1a40 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.1a40
3
+ Version: 0.2.1a41
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.1a40"
3
+ version = "0.2.1a41"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -485,15 +485,22 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
485
485
  return False
486
486
 
487
487
  async def _sync_async(self) -> dict:
488
- """同步目录(异步版本)"""
488
+ """同步目录(异步版本)
489
+
490
+ sync_dirs 条目支持两种格式:
491
+ (local_path, remote_path) -> 全量覆盖
492
+ (local_path, remote_path, mode) -> mode="full" 全量覆盖, mode="partial" 跳过已有子目录
493
+ """
489
494
  if not self._sync_dirs:
490
495
  SYLogger.info("[Sandbox] 没有配置同步目录")
491
496
  return {}
492
497
 
493
498
  SYLogger.info(f"[Sandbox] _sync_async 开始, 共 {len(self._sync_dirs)} 个目录")
494
499
  results = {}
495
- for idx, (local_path, remote_path) in enumerate(self._sync_dirs):
496
- SYLogger.info(f"[Sandbox] 同步目录 [{idx+1}/{len(self._sync_dirs)}]: {local_path} -> {remote_path}")
500
+ for idx, entry in enumerate(self._sync_dirs):
501
+ local_path, remote_path = entry[0], entry[1]
502
+ mode = entry[2] if len(entry) > 2 else "full"
503
+ SYLogger.info(f"[Sandbox] 同步目录 [{idx+1}/{len(self._sync_dirs)}]: {local_path} -> {remote_path} (mode={mode})")
497
504
  local_dir = Path(local_path)
498
505
 
499
506
  if not local_dir.exists():
@@ -503,7 +510,7 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
503
510
 
504
511
  if local_dir.is_dir():
505
512
  SYLogger.info(f"[Sandbox] 开始上传目录: {local_path}")
506
- result = await self._upload_directory_async(str(local_dir), remote_path)
513
+ result = await self._upload_directory_async(str(local_dir), remote_path, mode=mode)
507
514
  results[local_path] = result
508
515
  SYLogger.info(f"[Sandbox] 目录上传完成: {local_path}, 成功={result['success']}, 失败={result['failed']}")
509
516
  else:
@@ -520,8 +527,16 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
520
527
  SYLogger.info("[Sandbox] _sync_async 完成")
521
528
  return results
522
529
 
523
- async def _upload_directory_async(self, local_dir: str, remote_path: str = "/") -> dict:
524
- """上传整个目录到沙箱(异步版本)"""
530
+ async def _upload_directory_async(self, local_dir: str, remote_path: str = "/", *, mode: str = "full") -> dict:
531
+ """上传整个目录到沙箱(异步版本)
532
+
533
+ Args:
534
+ local_dir: 本地目录路径
535
+ remote_path: 沙箱目标路径
536
+ mode: 同步模式
537
+ - "full": 全量覆盖(默认),上传所有文件
538
+ - "partial": 部分覆盖,查询沙箱已有子目录并跳过同名目录
539
+ """
525
540
  local_path = Path(local_dir)
526
541
  if not local_path.exists():
527
542
  raise FileNotFoundError(f"本地目录不存在: {local_dir}")
@@ -529,7 +544,24 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
529
544
  if not local_path.is_dir():
530
545
  raise NotADirectoryError(f"路径不是目录: {local_dir}")
531
546
 
532
- SYLogger.info(f"[Sandbox] _upload_directory_async 开始: {local_dir} -> {remote_path}")
547
+ SYLogger.info(f"[Sandbox] _upload_directory_async 开始: {local_dir} -> {remote_path} (mode={mode})")
548
+
549
+ # partial 模式:查询沙箱已有子目录并跳过
550
+ existing_subdirs = set()
551
+ if mode == "partial":
552
+ try:
553
+ ls_result = await self._post_async(f"{SANDBOX_API_PREFIX}/ls", {
554
+ "path": remote_path,
555
+ "user_id": self._user_id
556
+ })
557
+ if ls_result and not ls_result.get("error"):
558
+ for item in ls_result.get("files", ls_result.get("children", [])):
559
+ if item.get("is_dir", False):
560
+ existing_subdirs.add(item.get("name", ""))
561
+ if existing_subdirs:
562
+ SYLogger.info(f"[Sandbox] partial 模式,跳过已有子目录: {existing_subdirs}")
563
+ except Exception as e:
564
+ SYLogger.warning(f"[Sandbox] 查询沙箱目录失败,将全量同步: {e}")
533
565
 
534
566
  exclude_patterns = [".git", "__pycache__", ".pyc", ".DS_Store", "node_modules"]
535
567
 
@@ -547,6 +579,19 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
547
579
  for root, dirs, files in os.walk(local_path):
548
580
  dirs[:] = [d for d in dirs if not should_exclude(d)]
549
581
 
582
+ # 对于 /skills 目录,跳过沙箱中已存在的子目录(只检查最外层)
583
+ if existing_subdirs:
584
+ try:
585
+ rel = Path(root).relative_to(local_path)
586
+ if str(rel) == ".":
587
+ before = len(dirs)
588
+ skipped_names = [d for d in dirs if d in existing_subdirs]
589
+ dirs[:] = [d for d in dirs if d not in existing_subdirs]
590
+ if skipped_names:
591
+ SYLogger.info(f"[Sandbox] 跳过已有技能目录: {skipped_names}")
592
+ except ValueError:
593
+ pass
594
+
550
595
  for file in files:
551
596
  if should_exclude(file):
552
597
  continue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.1a40
3
+ Version: 0.2.1a41
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown