sycommon-python-lib 0.2.1a35__tar.gz → 0.2.1a37__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.1a35 → sycommon_python_lib-0.2.1a37}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/sandbox/file_ops.py +156 -13
  4. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/sandbox/http_sandbox_backend.py +303 -56
  5. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  6. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/README.md +0 -0
  7. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/setup.cfg +0 -0
  8. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/__init__.py +0 -0
  9. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/cli.py +0 -0
  10. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/core/__init__.py +0 -0
  11. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/core/console.py +0 -0
  12. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/core/models.py +0 -0
  13. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/core/project.py +0 -0
  14. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/core/utils.py +0 -0
  15. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/templates/__init__.py +0 -0
  16. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/templates/agent/__init__.py +0 -0
  17. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/templates/base/__init__.py +0 -0
  18. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/command/templates/web/__init__.py +0 -0
  19. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/__init__.py +0 -0
  20. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/__init__.py +0 -0
  21. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/agent_manager.py +0 -0
  22. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/chat_events.py +0 -0
  23. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/deep_agent.py +0 -0
  24. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/multi_agent_team.py +0 -0
  25. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/sandbox/__init__.py +0 -0
  26. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  27. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  28. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/agent/sandbox/session.py +0 -0
  29. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/auth/__init__.py +0 -0
  30. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/auth/ldap_service.py +0 -0
  31. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/Config.py +0 -0
  32. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/DatabaseConfig.py +0 -0
  33. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  34. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/EmbeddingConfig.py +0 -0
  35. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/LLMConfig.py +0 -0
  36. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/LangfuseConfig.py +0 -0
  37. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/MQConfig.py +0 -0
  38. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/RedisConfig.py +0 -0
  39. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/RerankerConfig.py +0 -0
  40. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/SentryConfig.py +0 -0
  41. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/config/__init__.py +0 -0
  42. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/database/async_base_db_service.py +0 -0
  43. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/database/async_database_service.py +0 -0
  44. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/database/base_db_service.py +0 -0
  45. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/database/database_service.py +0 -0
  46. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/database/elasticsearch_service.py +0 -0
  47. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/database/redis_service.py +0 -0
  48. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/database/token_usage_db_service.py +0 -0
  49. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/health/__init__.py +0 -0
  50. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/health/health_check.py +0 -0
  51. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/health/metrics.py +0 -0
  52. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/health/ping.py +0 -0
  53. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/heartbeat_process/__init__.py +0 -0
  54. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  55. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  56. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  57. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/__init__.py +0 -0
  58. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/embedding.py +0 -0
  59. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/get_llm.py +0 -0
  60. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/llm_logger.py +0 -0
  61. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/llm_tokens.py +0 -0
  62. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  63. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  64. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  65. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/struct_token.py +0 -0
  66. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/sy_langfuse.py +0 -0
  67. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/token_usage_es_service.py +0 -0
  68. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  69. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/llm/usage_token.py +0 -0
  70. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/logging/__init__.py +0 -0
  71. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/logging/async_sql_logger.py +0 -0
  72. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/logging/kafka_log.py +0 -0
  73. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/logging/logger_levels.py +0 -0
  74. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/logging/logger_wrapper.py +0 -0
  75. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/logging/process_logger.py +0 -0
  76. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/logging/sql_logger.py +0 -0
  77. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/__init__.py +0 -0
  78. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/background_execution.py +0 -0
  79. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/context.py +0 -0
  80. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/cors.py +0 -0
  81. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/docs.py +0 -0
  82. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/exception.py +0 -0
  83. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/middleware.py +0 -0
  84. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/monitor_memory.py +0 -0
  85. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/mq.py +0 -0
  86. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/sandbox.py +0 -0
  87. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/timeout.py +0 -0
  88. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/middleware/traceid.py +0 -0
  89. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/models/__init__.py +0 -0
  90. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/models/base_http.py +0 -0
  91. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/models/log.py +0 -0
  92. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/models/mqlistener_config.py +0 -0
  93. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/models/mqmsg_model.py +0 -0
  94. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/models/mqsend_config.py +0 -0
  95. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/models/sandbox.py +0 -0
  96. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/models/sso_user.py +0 -0
  97. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/models/token_usage.py +0 -0
  98. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/models/token_usage_mysql.py +0 -0
  99. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/notice/__init__.py +0 -0
  100. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  101. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  102. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  103. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  104. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  105. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  106. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  107. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  108. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  109. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  110. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/sentry/__init__.py +0 -0
  111. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/sentry/sy_sentry.py +0 -0
  112. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/services.py +0 -0
  113. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/sse/__init__.py +0 -0
  114. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/sse/event.py +0 -0
  115. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/sse/sse.py +0 -0
  116. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/__init__.py +0 -0
  117. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/example.py +0 -0
  118. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/example2.py +0 -0
  119. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/feign.py +0 -0
  120. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/feign_client.py +0 -0
  121. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/nacos_client_base.py +0 -0
  122. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  123. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  124. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/nacos_service.py +0 -0
  125. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  126. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  127. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/synacos/param.py +0 -0
  128. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tests/deep_agent_server.py +0 -0
  129. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tests/test_deep_agent.py +0 -0
  130. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tests/test_email.py +0 -0
  131. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tests/test_mq.py +0 -0
  132. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tools/__init__.py +0 -0
  133. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tools/async_utils.py +0 -0
  134. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tools/docs.py +0 -0
  135. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tools/env.py +0 -0
  136. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tools/merge_headers.py +0 -0
  137. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tools/snowflake.py +0 -0
  138. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tools/syemail.py +0 -0
  139. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon/tools/timing.py +0 -0
  140. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -0
  141. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  142. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  143. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  144. {sycommon_python_lib-0.2.1a35 → sycommon_python_lib-0.2.1a37}/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.1a35
3
+ Version: 0.2.1a37
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.1a35"
3
+ version = "0.2.1a37"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -33,7 +33,7 @@ class FileOperationsMixin:
33
33
  """文件操作 Mixin
34
34
 
35
35
  适配 deepagents 0.5.0a2 协议
36
- 同步方法为主实现,异步方法通过 asyncio.to_thread 调用
36
+ 同步方法为主实现,异步方法使用 aiohttp 实现
37
37
  """
38
38
 
39
39
  _timeout: int # 类型提示,子类需要提供此属性
@@ -46,6 +46,10 @@ class FileOperationsMixin:
46
46
  """发送同步 POST 请求"""
47
47
  ...
48
48
 
49
+ async def _post_async_with_failover(self: "HTTPSandboxBackend", endpoint: str, data: dict, timeout: int = None) -> dict:
50
+ """发送异步 POST 请求(带故障转移)"""
51
+ ...
52
+
49
53
  def _ensure_synced_sync(self: "HTTPSandboxBackend"):
50
54
  """确保目录已同步(同步版本)"""
51
55
  if not self._auto_sync:
@@ -72,6 +76,32 @@ class FileOperationsMixin:
72
76
  self._workspace_verified = True
73
77
  SYLogger.info(f"[Sandbox] 同步完成")
74
78
 
79
+ async def _ensure_synced_async(self: "HTTPSandboxBackend"):
80
+ """确保目录已同步(异步版本)"""
81
+ if not self._auto_sync:
82
+ return
83
+
84
+ if self._synced and self._workspace_verified:
85
+ return
86
+
87
+ SYLogger.info(f"[Sandbox] 开始检查工作空间同步状态(异步)...")
88
+
89
+ try:
90
+ workspace_exists = await self._check_workspace_exists_async()
91
+ except Exception as e:
92
+ SYLogger.warning(f"[Sandbox] 检查工作空间异常: {e},跳过检查")
93
+ workspace_exists = True
94
+
95
+ if not workspace_exists:
96
+ SYLogger.info(f"[Sandbox] 工作空间不存在或已被清空,重新同步...")
97
+ self._synced = False
98
+
99
+ if not self._synced:
100
+ SYLogger.info(f"[Sandbox] 开始同步目录(异步)...")
101
+ await self._sync_async()
102
+ self._workspace_verified = True
103
+ SYLogger.info(f"[Sandbox] 同步完成")
104
+
75
105
  def _check_workspace_exists_sync(self: "HTTPSandboxBackend") -> bool:
76
106
  """检查沙箱工作空间是否存在(同步版本)"""
77
107
  try:
@@ -84,10 +114,26 @@ class FileOperationsMixin:
84
114
  SYLogger.warning(f"[Sandbox] 检查工作空间失败: {e}")
85
115
  return False
86
116
 
117
+ async def _check_workspace_exists_async(self: "HTTPSandboxBackend") -> bool:
118
+ """检查沙箱工作空间是否存在(异步版本)"""
119
+ try:
120
+ await self._post_async_with_failover(f"{SANDBOX_API_PREFIX}/ls", {
121
+ "path": "/",
122
+ "user_id": self.user_id
123
+ })
124
+ return True
125
+ except Exception as e:
126
+ SYLogger.warning(f"[Sandbox] 检查工作空间失败: {e}")
127
+ return False
128
+
87
129
  def _sync_sync(self: "HTTPSandboxBackend"):
88
130
  """同步目录(同步版本,由子类实现)"""
89
131
  ...
90
132
 
133
+ async def _sync_async(self: "HTTPSandboxBackend") -> dict:
134
+ """同步目录(异步版本,由子类实现)"""
135
+ ...
136
+
91
137
  # ============== 目录操作 ==============
92
138
 
93
139
  def ls(self: "HTTPSandboxBackend", path: str) -> LsResult:
@@ -107,8 +153,20 @@ class FileOperationsMixin:
107
153
  return LsResult(error=str(e))
108
154
 
109
155
  async def als(self: "HTTPSandboxBackend", path: str) -> LsResult:
110
- """异步列出目录内容"""
111
- return await asyncio.to_thread(self.ls, path)
156
+ """异步列出目录内容(真正的异步实现)"""
157
+ try:
158
+ await self._ensure_synced_async()
159
+ SYLogger.info(f"[Sandbox] 异步列出目录: {path}")
160
+ result = await self._post_async_with_failover(f"{SANDBOX_API_PREFIX}/ls", {
161
+ "path": path,
162
+ "user_id": self.user_id
163
+ })
164
+ entries = [FileInfo(**item) for item in result]
165
+ SYLogger.info(f"[Sandbox] 目录内容: {len(entries)} 项")
166
+ return LsResult(entries=entries)
167
+ except Exception as e:
168
+ SYLogger.error(f"[Sandbox] 异步列出目录失败: {e}")
169
+ return LsResult(error=str(e))
112
170
 
113
171
  # ============== 文件读写 ==============
114
172
 
@@ -153,8 +211,33 @@ class FileOperationsMixin:
153
211
  offset: int = 0,
154
212
  limit: int = 2000,
155
213
  ) -> ReadResult:
156
- """异步读取文件内容"""
157
- return await asyncio.to_thread(self.read, file_path, offset, limit)
214
+ """异步读取文件内容(真正的异步实现)"""
215
+ try:
216
+ await self._ensure_synced_async()
217
+ SYLogger.info(f"[Sandbox] 异步读取文件: {file_path} (offset={offset}, limit={limit})")
218
+ result = await self._post_async_with_failover(f"{SANDBOX_API_PREFIX}/read", {
219
+ "file_path": file_path,
220
+ "user_id": self.user_id,
221
+ "offset": offset,
222
+ "limit": limit
223
+ })
224
+ if result.get("error"):
225
+ SYLogger.error(f"[Sandbox] 异步读取文件失败: {result['error']}")
226
+ return ReadResult(error=result["error"])
227
+ content = result.get("content", "")
228
+ SYLogger.info(f"[Sandbox] 异步读取完成: {len(content)} 字符")
229
+ from datetime import datetime
230
+ now = datetime.now().isoformat()
231
+ file_data = FileData(
232
+ content=content,
233
+ encoding="utf-8",
234
+ created_at=result.get("created_at", now),
235
+ modified_at=result.get("modified_at", now),
236
+ )
237
+ return ReadResult(file_data=file_data)
238
+ except Exception as e:
239
+ SYLogger.error(f"[Sandbox] 异步读取文件异常: {e}")
240
+ return ReadResult(error=str(e))
158
241
 
159
242
  def write(
160
243
  self: "HTTPSandboxBackend",
@@ -188,8 +271,27 @@ class FileOperationsMixin:
188
271
  file_path: str,
189
272
  content: str,
190
273
  ) -> WriteResult:
191
- """异步写入文件"""
192
- return await asyncio.to_thread(self.write, file_path, content)
274
+ """异步写入文件(真正的异步实现)"""
275
+ try:
276
+ await self._ensure_synced_async()
277
+ SYLogger.info(f"[Sandbox] 异步写入文件: {file_path} ({len(content)} 字符)")
278
+ result = await self._post_async_with_failover(f"{SANDBOX_API_PREFIX}/write", {
279
+ "file_path": file_path,
280
+ "content": base64.b64encode(content.encode()).decode(),
281
+ "user_id": self.user_id
282
+ })
283
+ write_result = WriteResult(
284
+ error=result.get("error"),
285
+ path=result.get("path")
286
+ )
287
+ if write_result.error:
288
+ SYLogger.error(f"[Sandbox] 异步写入失败: {write_result.error}")
289
+ else:
290
+ SYLogger.info(f"[Sandbox] 异步写入成功: {write_result.path}")
291
+ return write_result
292
+ except Exception as e:
293
+ SYLogger.error(f"[Sandbox] 异步写入文件异常: {e}")
294
+ return WriteResult(error=str(e))
193
295
 
194
296
  def edit(
195
297
  self: "HTTPSandboxBackend",
@@ -224,8 +326,24 @@ class FileOperationsMixin:
224
326
  new_string: str,
225
327
  replace_all: bool = False,
226
328
  ) -> EditResult:
227
- """异步编辑文件"""
228
- return await asyncio.to_thread(self.edit, file_path, old_string, new_string, replace_all)
329
+ """异步编辑文件(真正的异步实现)"""
330
+ try:
331
+ await self._ensure_synced_async()
332
+ result = await self._post_async_with_failover(f"{SANDBOX_API_PREFIX}/edit", {
333
+ "file_path": file_path,
334
+ "old_string": base64.b64encode(old_string.encode()).decode(),
335
+ "new_string": base64.b64encode(new_string.encode()).decode(),
336
+ "user_id": self.user_id,
337
+ "replace_all": replace_all
338
+ })
339
+ return EditResult(
340
+ error=result.get("error"),
341
+ path=result.get("path"),
342
+ occurrences=result.get("occurrences")
343
+ )
344
+ except Exception as e:
345
+ SYLogger.error(f"[Sandbox] 异步编辑文件异常: {e}")
346
+ return EditResult(error=str(e))
229
347
 
230
348
  # ============== 搜索 ==============
231
349
 
@@ -245,8 +363,19 @@ class FileOperationsMixin:
245
363
  return GlobResult(error=str(e))
246
364
 
247
365
  async def aglob(self: "HTTPSandboxBackend", pattern: str, path: str = "/") -> GlobResult:
248
- """异步 glob 搜索文件"""
249
- return await asyncio.to_thread(self.glob, pattern, path)
366
+ """异步 glob 搜索文件(真正的异步实现)"""
367
+ try:
368
+ await self._ensure_synced_async()
369
+ result = await self._post_async_with_failover(f"{SANDBOX_API_PREFIX}/glob", {
370
+ "pattern": pattern,
371
+ "path": path,
372
+ "user_id": self.user_id
373
+ })
374
+ matches = [FileInfo(**item) for item in result]
375
+ return GlobResult(matches=matches)
376
+ except Exception as e:
377
+ SYLogger.error(f"[Sandbox] 异步 glob 搜索失败: {e}")
378
+ return GlobResult(error=str(e))
250
379
 
251
380
  def grep(
252
381
  self: "HTTPSandboxBackend",
@@ -277,8 +406,22 @@ class FileOperationsMixin:
277
406
  path: str = None,
278
407
  glob: str = None,
279
408
  ) -> GrepResult:
280
- """异步搜索文件内容"""
281
- return await asyncio.to_thread(self.grep, pattern, path, glob)
409
+ """异步搜索文件内容(真正的异步实现)"""
410
+ try:
411
+ await self._ensure_synced_async()
412
+ result = await self._post_async_with_failover(f"{SANDBOX_API_PREFIX}/grep", {
413
+ "pattern": pattern,
414
+ "user_id": self.user_id,
415
+ "path": path,
416
+ "glob": glob
417
+ })
418
+ if isinstance(result, list):
419
+ matches = [GrepMatch(**item) for item in result]
420
+ return GrepResult(matches=matches)
421
+ return GrepResult(error="Unexpected result format")
422
+ except Exception as e:
423
+ SYLogger.error(f"[Sandbox] 异步 grep 搜索失败: {e}")
424
+ return GrepResult(error=str(e))
282
425
 
283
426
  # ============== 兼容旧版 API(已废弃)==============
284
427