sycommon-python-lib 0.2.7a21__tar.gz → 0.2.7a23__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 (334) hide show
  1. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/sandbox_path_guard.py +7 -1
  4. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/skill_api_whitelist.py +149 -23
  5. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/file_ops.py +61 -27
  6. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/http_sandbox_backend.py +11 -6
  7. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/sandbox.py +239 -70
  8. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  9. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/README.md +0 -0
  10. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/setup.cfg +0 -0
  11. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/__init__.py +0 -0
  12. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/cli.py +0 -0
  13. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/core/__init__.py +0 -0
  14. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/core/console.py +0 -0
  15. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/core/models.py +0 -0
  16. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/core/project.py +0 -0
  17. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/core/utils.py +0 -0
  18. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/__init__.py +0 -0
  19. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/README.md.tpl +0 -0
  20. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/__init__.py +0 -0
  21. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  22. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  23. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  24. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  25. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/api/query.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/app.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/db/service.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/model/parse.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/.env.tpl +0 -0
  42. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/.gitignore.tpl +0 -0
  43. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/Dockerfile.tpl +0 -0
  44. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/README.md.tpl +0 -0
  45. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/__init__.py +0 -0
  46. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/app.py.tpl +0 -0
  47. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/app.yaml.tpl +0 -0
  48. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  49. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/client/__init__.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/model/__init__.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/model/file_info.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/requirements.txt.tpl +0 -0
  53. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/README.md.tpl +0 -0
  54. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/__init__.py +0 -0
  55. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/app.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  58. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  59. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  60. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/README.md.tpl +0 -0
  61. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/__init__.py +0 -0
  62. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/api/__init__.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/api/echo.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/app.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/client/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/model/__init__.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/tools/mq.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/nexus/__init__.py +0 -0
  72. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/__init__.py +0 -0
  73. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/__main__.py +0 -0
  74. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/acp/__init__.py +0 -0
  75. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/acp/config.py +0 -0
  76. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/acp/executor.py +0 -0
  77. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/acp/registry.py +0 -0
  78. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/acp/server.py +0 -0
  79. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/agents/__init__.py +0 -0
  80. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/agents/factory.py +0 -0
  81. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/agents/prompts.py +0 -0
  82. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/__init__.py +0 -0
  83. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/browser.py +0 -0
  84. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/__init__.py +0 -0
  85. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/console.py +0 -0
  86. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/dom.py +0 -0
  87. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/network.py +0 -0
  88. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  89. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/performance.py +0 -0
  90. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  91. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/client.py +0 -0
  92. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/protocol.py +0 -0
  93. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/repl.py +0 -0
  94. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/cli.py +0 -0
  95. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/__init__.py +0 -0
  96. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/acp_cmd.py +0 -0
  97. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/cdp_cmd.py +0 -0
  98. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/chat_cmd.py +0 -0
  99. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/create_cmd.py +0 -0
  100. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/evaluate_cmd.py +0 -0
  101. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/init_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/memory_cmd.py +0 -0
  103. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/resume_cmd.py +0 -0
  104. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/rollback_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/run_cmd.py +0 -0
  106. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/core/__init__.py +0 -0
  107. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/core/backend.py +0 -0
  108. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/core/config.py +0 -0
  109. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/core/display.py +0 -0
  110. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/core/git_integration.py +0 -0
  111. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/core/llm.py +0 -0
  112. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/core/state.py +0 -0
  113. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/evaluate/__init__.py +0 -0
  114. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/evaluate/api_evaluator.py +0 -0
  115. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/__init__.py +0 -0
  116. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/compressor.py +0 -0
  117. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/full.py +0 -0
  118. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/hot.py +0 -0
  119. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/manager.py +0 -0
  120. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/warm.py +0 -0
  121. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/mode/__init__.py +0 -0
  122. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/mode/create.py +0 -0
  123. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/mode/optimize.py +0 -0
  124. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/models/__init__.py +0 -0
  125. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/models/config_models.py +0 -0
  126. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/__init__.py +0 -0
  127. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/baseline_tests.py +0 -0
  128. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/checkpoint.py +0 -0
  129. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/convergence.py +0 -0
  130. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/diagnosis.py +0 -0
  131. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/engine.py +0 -0
  132. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/environment.py +0 -0
  133. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/experience.py +0 -0
  134. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/harness_prompts.py +0 -0
  135. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/history.py +0 -0
  136. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/optimization_logger.py +0 -0
  137. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/pre_validation.py +0 -0
  138. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/reward.py +0 -0
  139. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/strategy_bandit.py +0 -0
  140. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/strategy_generator.py +0 -0
  141. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/strategy_prompts.py +0 -0
  142. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/simple_chat_agent.py +0 -0
  143. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycli/skills/__init__.py +0 -0
  144. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/__init__.py +0 -0
  145. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/__init__.py +0 -0
  146. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/acp/__init__.py +0 -0
  147. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/acp/client.py +0 -0
  148. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/acp/fetch.py +0 -0
  149. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/acp/ssh_init.py +0 -0
  150. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/acp/tool.py +0 -0
  151. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/agent_manager.py +0 -0
  152. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/chat_events.py +0 -0
  153. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/deep_agent.py +0 -0
  154. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/mcp/__init__.py +0 -0
  155. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/mcp/models.py +0 -0
  156. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  157. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  158. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
  159. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
  160. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  161. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/multi_agent_team.py +0 -0
  162. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/__init__.py +0 -0
  163. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  164. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  165. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  166. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  167. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/session.py +0 -0
  168. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/summarization_utils.py +0 -0
  169. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/__init__.py +0 -0
  170. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/ldap_service.py +0 -0
  171. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/oa_cache.py +0 -0
  172. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/oa_crypto.py +0 -0
  173. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/oa_service.py +0 -0
  174. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  175. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/ACPAgentConfig.py +0 -0
  176. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/Config.py +0 -0
  177. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/DatabaseConfig.py +0 -0
  178. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  179. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/EmbeddingConfig.py +0 -0
  180. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/LLMConfig.py +0 -0
  181. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/LangfuseConfig.py +0 -0
  182. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/MQConfig.py +0 -0
  183. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/PgConfig.py +0 -0
  184. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/RedisConfig.py +0 -0
  185. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/RerankerConfig.py +0 -0
  186. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/SentryConfig.py +0 -0
  187. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
  188. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/XxlJobConfig.py +0 -0
  189. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/__init__.py +0 -0
  190. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/config_change_notifier.py +0 -0
  191. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/async_base_db_service.py +0 -0
  192. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/async_database_service.py +0 -0
  193. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/base_db_service.py +0 -0
  194. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/database_service.py +0 -0
  195. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/elasticsearch_service.py +0 -0
  196. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  197. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/redis_service.py +0 -0
  198. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/resilient_pg_saver.py +0 -0
  199. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/token_usage_db_service.py +0 -0
  200. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/health/__init__.py +0 -0
  201. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/health/health_check.py +0 -0
  202. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/health/metrics.py +0 -0
  203. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/health/ping.py +0 -0
  204. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/heartbeat_process/__init__.py +0 -0
  205. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  206. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  207. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  208. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/__init__.py +0 -0
  209. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/embedding.py +0 -0
  210. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/get_llm.py +0 -0
  211. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/llm_logger.py +0 -0
  212. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/llm_tokens.py +0 -0
  213. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  214. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  215. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  216. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/struct_token.py +0 -0
  217. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/sy_langfuse.py +0 -0
  218. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  219. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  220. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/token_usage_es_service.py +0 -0
  221. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  222. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/token_utils.py +0 -0
  223. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/usage_token.py +0 -0
  224. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/__init__.py +0 -0
  225. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/async_sql_logger.py +0 -0
  226. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/kafka_log.py +0 -0
  227. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/log_masker.py +0 -0
  228. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/logger_levels.py +0 -0
  229. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/logger_wrapper.py +0 -0
  230. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/process_logger.py +0 -0
  231. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/sql_logger.py +0 -0
  232. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/mcp_server/__init__.py +0 -0
  233. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/mcp_server/server.py +0 -0
  234. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/__init__.py +0 -0
  235. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/context.py +0 -0
  236. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/cors.py +0 -0
  237. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/docs.py +0 -0
  238. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/exception.py +0 -0
  239. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/middleware.py +0 -0
  240. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/monitor_memory.py +0 -0
  241. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/mq.py +0 -0
  242. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/timeout.py +0 -0
  243. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/token_tracking.py +0 -0
  244. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  245. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/traceid.py +0 -0
  246. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/__init__.py +0 -0
  247. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/base_http.py +0 -0
  248. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/log.py +0 -0
  249. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/mcp_server_config.py +0 -0
  250. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/mqlistener_config.py +0 -0
  251. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/mqmsg_model.py +0 -0
  252. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/mqsend_config.py +0 -0
  253. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/sandbox.py +0 -0
  254. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/sso_user.py +0 -0
  255. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/token_usage.py +0 -0
  256. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/token_usage_mysql.py +0 -0
  257. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/xxljob_handler_config.py +0 -0
  258. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/notice/__init__.py +0 -0
  259. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  260. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/notice/wecom_message.py +0 -0
  261. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  262. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  263. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  264. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  265. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  266. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  267. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  268. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  269. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  270. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/sentry/__init__.py +0 -0
  271. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/sentry/sy_sentry.py +0 -0
  272. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/services.py +0 -0
  273. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/sse/__init__.py +0 -0
  274. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/sse/event.py +0 -0
  275. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/sse/sse.py +0 -0
  276. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/__init__.py +0 -0
  277. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/example.py +0 -0
  278. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/example2.py +0 -0
  279. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/feign.py +0 -0
  280. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/feign_client.py +0 -0
  281. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_client_base.py +0 -0
  282. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  283. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  284. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_service.py +0 -0
  285. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  286. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  287. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/param.py +0 -0
  288. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/deep_agent_server.py +0 -0
  289. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_consistent_hash.py +0 -0
  290. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  291. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  292. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_deep_agent.py +0 -0
  293. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  294. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_email.py +0 -0
  295. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_encoding_cache.py +0 -0
  296. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_fix_verification.py +0 -0
  297. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_mcp_server.py +0 -0
  298. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  299. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_mq.py +0 -0
  300. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_oa_login.py +0 -0
  301. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  302. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_real_summarization.py +0 -0
  303. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_summarization_config.py +0 -0
  304. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_summarization_real.py +0 -0
  305. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  306. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/__init__.py +0 -0
  307. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/async_utils.py +0 -0
  308. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/docs.py +0 -0
  309. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/env.py +0 -0
  310. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/merge_headers.py +0 -0
  311. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/snowflake.py +0 -0
  312. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/syemail.py +0 -0
  313. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/timing.py +0 -0
  314. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/xxljob/__init__.py +0 -0
  315. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon/xxljob/xxljob_service.py +0 -0
  316. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -0
  317. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  318. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  319. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  320. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  321. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_acp_tool.py +0 -0
  322. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_asyncio_logging.py +0 -0
  323. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_config_change_notifier.py +0 -0
  324. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_hotreload_snapshot.py +0 -0
  325. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_llm_apikey_contextvar.py +0 -0
  326. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_log_masker.py +0 -0
  327. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_resilient_pg_saver.py +0 -0
  328. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_sandbox_path_guard.py +0 -0
  329. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_sensitive_guard.py +0 -0
  330. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_simple_chat_agent.py +0 -0
  331. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_skill_regex_upgrade.py +0 -0
  332. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_skill_write_guard.py +0 -0
  333. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_sycli.py +0 -0
  334. {sycommon_python_lib-0.2.7a21 → sycommon_python_lib-0.2.7a23}/tests/test_sync_skills_to_sandbox.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.7a21
3
+ Version: 0.2.7a23
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.7a21"
3
+ version = "0.2.7a23"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -61,7 +61,13 @@ _PATH_TOOLS = {
61
61
 
62
62
  # 宿主沙箱根前缀(用于 execute 命令串扫描;shell 里无法安全改写,只能拦)。
63
63
  # 命中即视为「引用了宿主沙箱真实路径」,一律拦。
64
- _HOST_SANDBOX_RE = re.compile(re.escape(_WORKSPACE_ROOT) + r'(?:/|\\)')
64
+ # 注意:要拦到「根目录本身」和「根下子路径」两种形式。原来要求尾斜杠
65
+ # (_WORKSPACE_ROOT/),会漏过 `find /data/sycommon_sandbox -name x`(后跟空格,
66
+ # 没有尾斜杠)这种「拿沙箱根当 find 起点」的越权扫描。改为允许「尾斜杠」或
67
+ # 「词边界(后跟空白/行尾/引号)」,根目录本身与任意子路径都能命中。
68
+ _HOST_SANDBOX_RE = re.compile(
69
+ re.escape(_WORKSPACE_ROOT) + r'(?:[/\\]|(?=\s|$|["\']))'
70
+ )
65
71
 
66
72
  _DENIED_MSG = (
67
73
  "Error: 不允许使用宿主机绝对路径访问沙箱文件。"
@@ -19,6 +19,8 @@
19
19
  allowlist:[] 空数组 → 注入空白名单(全拦截)。
20
20
  """
21
21
 
22
+ import base64
23
+ import hashlib
22
24
  import json
23
25
  import os
24
26
  import re
@@ -26,6 +28,7 @@ import shlex
26
28
  from typing import Optional
27
29
 
28
30
  from langchain.agents.middleware.types import AgentMiddleware
31
+ from langchain_core.messages import ToolMessage
29
32
  from langgraph.prebuilt.tool_node import ToolCallRequest
30
33
 
31
34
  from sycommon.logging.kafka_log import SYLogger
@@ -41,14 +44,94 @@ _SKILL_TOP_RE = re.compile(
41
44
  # BASE_URL 占位符 ${VAR}
42
45
  _PLACEHOLDER_RE = re.compile(r'\$\{([A-Z_][A-Z0-9_]*)\}')
43
46
 
44
- # 推送到沙箱 workspace 内的 .wl 目录(沙箱强制路径隔离,绝对路径会被映射进 workspace,
45
- # 故用相对 POSIX 路径,落地为 {workspace}/.wl/,再 export PYTHONPATH 让 Python 自动 import)
46
- _PUSH_FILES = [
47
- ("sitecustomize.py", ".wl/sitecustomize.py"),
48
- ("skill_wl_check.py", ".wl/skill_wl_check.py"),
49
- ]
50
47
  # workspace 内白名单目录的 shell 形式(init_script 已 export $SANDBOX_ROOT,运行期展开)
51
48
  _WL_DIR = "$SANDBOX_ROOT/.wl"
49
+ # .wl 目录在 workspace 内的相对路径段(用于 hash 校验命令里的文件名)
50
+ _WL_FILES = [
51
+ ".wl/sitecustomize.py", # 极小 loader(明文,无业务逻辑)
52
+ ".wl/sitecustomize.payload", # sitecustomize.py 源码的 base64
53
+ ".wl/skill_wl_check.payload", # skill_wl_check.py 源码的 base64
54
+ ]
55
+
56
+ # ---- 极小 loader(落盘为 .wl/sitecustomize.py)----
57
+ # 不含任何白名单/拦截业务逻辑,只做"解码同目录 payload + exec"。
58
+ # 关键:把 skill_wl_check 注册成真模块对象进 sys.modules,使 sitecustomize.payload
59
+ # 里的 `import skill_wl_check; skill_wl_check.match(...)` 按原逻辑工作(逻辑不变)。
60
+ _LOADER_SRC = b'''# sycommon injected loader: decode payloads, exec them. No business logic.
61
+ import os, sys, base64, types
62
+ _HERE = os.path.dirname(os.path.abspath(__file__))
63
+ if _HERE not in sys.path:
64
+ sys.path.insert(0, _HERE)
65
+
66
+
67
+ def _run(name, ns):
68
+ p = os.path.join(_HERE, name)
69
+ try:
70
+ with open(p, "rb") as f:
71
+ exec(compile(base64.b64decode(f.read()), name, "exec"), ns)
72
+ except Exception as _e:
73
+ sys.stderr.write("[.wl loader] load %s failed: %s\\n" % (name, _e))
74
+
75
+
76
+ _wl = types.ModuleType("skill_wl_check")
77
+ sys.modules["skill_wl_check"] = _wl
78
+ _run("skill_wl_check.payload", _wl.__dict__)
79
+ _run("sitecustomize.payload", globals())
80
+ '''
81
+
82
+
83
+ def _build_payload(src_name: str) -> bytes:
84
+ """读包内源码并 base64 编码,作为 .payload 落盘内容(防明文窥探)。"""
85
+ raw = _load_resource_bytes(src_name)
86
+ return base64.b64encode(raw)
87
+
88
+
89
+ def _expected_hashes() -> dict:
90
+ """运行时从主进程源码算各 .wl 文件的预期 sha256(hex)。
91
+
92
+ payload 的预期 hash 算的是【编码后的 base64 字节】——即沙箱里实际落盘内容,
93
+ 这样 sha256 比对的就是真实文件内容。loader 的预期 hash 算 _LOADER_SRC(固定常量)。
94
+ """
95
+ loader_bytes = _LOADER_SRC
96
+ sc_bytes = _build_payload("sitecustomize.py")
97
+ wl_bytes = _build_payload("skill_wl_check.py")
98
+ return {
99
+ ".wl/sitecustomize.py": hashlib.sha256(loader_bytes).hexdigest(),
100
+ ".wl/sitecustomize.payload": hashlib.sha256(sc_bytes).hexdigest(),
101
+ ".wl/skill_wl_check.payload": hashlib.sha256(wl_bytes).hexdigest(),
102
+ }
103
+
104
+
105
+ # ---- .wl 写拦截(复刻 skill_write_guard 的正则集合)----
106
+ # .wl 目录保护:精确匹配 .wl 或 .wl/...(带边界,防误伤 myapp.wl 之类)
107
+ _WL_PROTECTED_RE = re.compile(r'\.wl(?:/|\s|"|\'|$)')
108
+ # 写动作动词(命令首或分号/管道/空格后)
109
+ _WRITE_VERB_RE = re.compile(
110
+ r'(^|[\s;&|])(rm|rmdir|mv|cp|chmod|chown|tee|truncate|install|rsync|scp|dd|>\.wl)\b')
111
+ # 输出重定向 > 或 >>
112
+ _REDIRECT_RE = re.compile(r'>>?')
113
+ _WL_DENIED_MSG = "Error: .wl 为系统注入目录,禁止写入/修改/删除。"
114
+
115
+
116
+ def _command_writes_wl(cmd: str) -> bool:
117
+ """execute 命令是否在写 .wl:命中 .wl 路径 且 含写动词或重定向。"""
118
+ if not _WL_PROTECTED_RE.search(cmd or ""):
119
+ return False
120
+ return bool(_WRITE_VERB_RE.search(cmd) or _REDIRECT_RE.search(cmd))
121
+
122
+
123
+ def _is_wl_path(p: str) -> bool:
124
+ """file_path 是否落在 .wl 目录内(write_file/edit_file 拦截用)。
125
+
126
+ 注意不能用 lstrip("./")——它是按字符集 strip,会把 ".wl" 的前导 "." 也吃成 "wl"。
127
+ 改为逐前缀剥离再判。
128
+ """
129
+ s = (p or "").strip().replace("\\", "/")
130
+ # 剥前导 ./ 和 /
131
+ while s.startswith("./") or s.startswith("/"):
132
+ s = s[1:] if s.startswith("/") else s[2:]
133
+ return s == ".wl" or s.startswith(".wl/")
134
+
52
135
 
53
136
 
54
137
  def _resolve_placeholders(pattern: str, env_lookup) -> Optional[str]:
@@ -120,7 +203,8 @@ class SkillApiWhitelistMiddleware(AgentMiddleware):
120
203
 
121
204
  def __init__(self, sandbox_backend):
122
205
  self._backend = sandbox_backend
123
- self._pushed: bool = False # 注入脚本是否已推送(每 backend 实例一次)
206
+ # 注:不再缓存"已推送"标志。用户可在会话中删除 .wl/ 绕过白名单,
207
+ # 故改为每次 execute 前校验文件完整性、缺则重推(见 _ensure_sitecustomize)。
124
208
 
125
209
  def _env_lookup(self):
126
210
  """构造占位符查找器:先查主进程 os.environ,再查 sandbox env 字典。
@@ -155,27 +239,54 @@ class SkillApiWhitelistMiddleware(AgentMiddleware):
155
239
 
156
240
  # ---- 懒加载:把注入脚本推进沙箱 workspace/.wl ----
157
241
  async def _ensure_sitecustomize(self) -> bool:
158
- """把 sitecustomize.py + skill_wl_check.py 推到沙箱 workspace 内的 .wl 目录。
242
+ """把 loader + 2 个 base64 payload 推到沙箱 workspace 内的 .wl 目录。
159
243
 
160
- 沙箱强制路径隔离:任何绝对路径都会被 resolve_sandbox_path 映射进用户 workspace,
161
- 真实 site-packages 无法写入。故改用「推到 workspace/.wl/ + export PYTHONPATH」
162
- 的方案:Python 启动时若 .wl PYTHONPATH 上,会自动 import sitecustomize。
163
-
164
- 幂等:每个 backend 实例只推一次(_pushed 标记)。失败 fail-open(不阻塞业务)。
244
+ 防篡改 + 自愈:每次 execute 前对 3 个文件算 sha256,与主进程源码算出的
245
+ 预期 hash 比对。任一文件缺失/被改 全量重推 + chmod 555。
246
+ 旧的 test -f 存在性校验挡不住「用户把 sitecustomize 改成空文件」,
247
+ sha256 内容校验才能挡。失败 fail-open(不阻塞业务)。
165
248
  """
166
- if self._pushed:
167
- return True
168
249
  backend = self._backend
169
250
  if backend is None:
170
251
  return False
171
252
  try:
172
- files = []
173
- for src, dst in _PUSH_FILES:
174
- content = _load_resource_bytes(src)
175
- files.append((dst, content))
253
+ expected = _expected_hashes()
254
+ # 一条命令取三个文件的 sha256(缺失则该行输出 MISSING),换行拼接返回。
255
+ files_quoted = " ".join(
256
+ shlex.quote(f) for f in _WL_FILES)
257
+ check_cmd = (
258
+ f'for f in {files_quoted}; do '
259
+ f'if [ -f "$SANDBOX_ROOT/$f" ]; then '
260
+ f'sha256sum "$SANDBOX_ROOT/$f" 2>/dev/null | cut -d" " -f1; '
261
+ f'else echo MISSING; fi; done'
262
+ )
263
+ try:
264
+ resp = await backend.aexecute(check_cmd)
265
+ actual_lines = (getattr(resp, "output", "") or "").strip().splitlines()
266
+ except Exception:
267
+ actual_lines = []
268
+
269
+ # 逐文件比对:长度/顺序与 _WL_FILES 对应
270
+ intact = (len(actual_lines) == len(_WL_FILES)
271
+ and all(actual_lines[i] == expected[_WL_FILES[i]]
272
+ for i in range(len(_WL_FILES))))
273
+
274
+ if intact:
275
+ return True # 内容完整,无需重推
276
+
277
+ # 重推:loader 明文 + 2 个 payload
278
+ files = [
279
+ (".wl/sitecustomize.py", _LOADER_SRC),
280
+ (".wl/sitecustomize.payload", _build_payload("sitecustomize.py")),
281
+ (".wl/skill_wl_check.payload", _build_payload("skill_wl_check.py")),
282
+ ]
176
283
  await backend.aupload_files(files)
177
- self._pushed = True
178
- SYLogger.info("[Whitelist] 注入脚本已推送至沙箱 %s", _WL_DIR)
284
+ # chmod -R 555:挡普通用户改/删(root 仍可绕,靠 sha256 自愈兜底)
285
+ try:
286
+ await backend.aexecute(f'chmod -R 555 "{_WL_DIR}"')
287
+ except Exception as _ce:
288
+ SYLogger.warning("[Whitelist] chmod .wl 555 失败(非致命): %s", _ce)
289
+ SYLogger.info("[Whitelist] 注入脚本已(重新)推送至沙箱 %s (sha256 校验触发)", _WL_DIR)
179
290
  return True
180
291
  except Exception as e:
181
292
  SYLogger.error("[Whitelist] 推送 sitecustomize 失败(fail-open): %s", e)
@@ -195,10 +306,25 @@ class SkillApiWhitelistMiddleware(AgentMiddleware):
195
306
  handler,
196
307
  ):
197
308
  tc = request.tool_call
198
- if tc.get("name") != "execute":
309
+ name = tc.get("name")
310
+ args = tc.get("args", {}) or {}
311
+
312
+ # ---- .wl 写拦截(短路 fail-closed,在任何业务逻辑之前)----
313
+ # 防 agent 经 write_file/edit_file/execute 篡改注入目录。参考 SkillWriteGuard。
314
+ if name in ("write_file", "edit_file"):
315
+ fp = args.get("file_path") if isinstance(args, dict) else ""
316
+ if _is_wl_path(fp):
317
+ return ToolMessage(content=_WL_DENIED_MSG, name=name,
318
+ tool_call_id=tc.get("id", ""), status="error")
319
+ elif name == "execute":
320
+ command = args.get("command", "") if isinstance(args, dict) else ""
321
+ if _command_writes_wl(command):
322
+ return ToolMessage(content=_WL_DENIED_MSG, name="execute",
323
+ tool_call_id=tc.get("id", ""), status="error")
324
+
325
+ if name != "execute":
199
326
  return await handler(request)
200
327
 
201
- args = tc.get("args", {}) or {}
202
328
  command = args.get("command", "") if isinstance(args, dict) else ""
203
329
  if not command:
204
330
  return await handler(request)
@@ -54,6 +54,25 @@ _EDIT_ERROR_CODE_MAP = {
54
54
  }
55
55
 
56
56
 
57
+ # 服务端 /ls 错误码 -> 人类可读文案(对齐 BaseSandbox._parse_ls_output 的
58
+ # path_not_found / not_a_directory 语义)。未在表内的码原样透传。
59
+ _LS_ERROR_MAP = {
60
+ "path_not_found": "path not found",
61
+ "not_a_directory": "not a directory",
62
+ "permission_denied": "permission denied",
63
+ "list_failed": "listing failed",
64
+ }
65
+
66
+
67
+ # 服务端 /delete 错误码 -> 人类可读文案(统一前缀 "Failed to delete '<path>': ...",
68
+ # 与 write 的 "Failed to write file '<path>': ..." 风格一致)。
69
+ _DELETE_ERROR_MAP = {
70
+ "file_not_found": "file not found",
71
+ "is_directory": "is a directory, set recursive=true",
72
+ "permission_denied": "permission denied",
73
+ }
74
+
75
+
57
76
  def _normalize_edit_error(error: str, file_path: str, old_string: str) -> str:
58
77
  """把服务端的自由格式错误串映射成与 BaseSandbox 一致的可读消息。
59
78
 
@@ -282,7 +301,14 @@ class FileOperationsMixin:
282
301
  "path": path,
283
302
  "user_id": self.user_id
284
303
  })
285
- # 服务端 /ls 失败时返回 [](无 error 字段),HTTP 层失败已进 except
304
+ # 服务端路径不存在/非目录时返回 {"error": "path_not_found"/"not_a_directory"/...}
305
+ # 对齐 BaseSandbox._parse_ls_output,映射成 "Path '<path>': <reason>",
306
+ # 而非当成空目录成功(否则 agent 会误判路径存在但无文件)。
307
+ if isinstance(result, dict) and result.get("error"):
308
+ err = result["error"]
309
+ # 归一化错误码为人类可读文案(对齐 BaseSandbox 的 path_not_found/not_a_directory 语义)
310
+ err_msg = _LS_ERROR_MAP.get(err, err)
311
+ return LsResult(entries=None, error=f"Path '{path}': {err_msg}")
286
312
  entries = [FileInfo(**item) for item in (result or [])]
287
313
  SYLogger.info(f"[Sandbox] 目录内容: {len(entries)} 项")
288
314
  return LsResult(entries=entries)
@@ -300,6 +326,10 @@ class FileOperationsMixin:
300
326
  "path": path,
301
327
  "user_id": self.user_id
302
328
  }, timeout=timeout)
329
+ if isinstance(result, dict) and result.get("error"):
330
+ err = result["error"]
331
+ err_msg = _LS_ERROR_MAP.get(err, err)
332
+ return LsResult(entries=None, error=f"Path '{path}': {err_msg}")
303
333
  entries = [FileInfo(**item) for item in (result or [])]
304
334
  SYLogger.info(f"[Sandbox] 目录内容: {len(entries)} 项")
305
335
  return LsResult(entries=entries)
@@ -606,7 +636,10 @@ class FileOperationsMixin:
606
636
  # ============== 树形目录 ==============
607
637
 
608
638
  def tree(self: "HTTPSandboxBackend", path: str = "/", max_depth: int = 30, max_files: int = 0) -> TreeResult:
609
- """以树形结构展示目录"""
639
+ """以树形结构展示目录
640
+
641
+ 错误前缀对齐 read/ls/grep/glob:统一包装为 "Path '<path>': <reason>"。
642
+ """
610
643
  try:
611
644
  self._lazy_sync_skill_from_path_sync(path)
612
645
  self._ensure_synced_sync()
@@ -618,13 +651,13 @@ class FileOperationsMixin:
618
651
  "max_files": max_files,
619
652
  })
620
653
  if result.get("error"):
621
- return TreeResult(error=result["error"])
654
+ return TreeResult(error=f"Path '{path}': {result['error']}")
622
655
  tree_node = TreeNode(
623
656
  **result["tree"]) if result.get("tree") else None
624
657
  return TreeResult(tree=tree_node)
625
658
  except Exception as e:
626
659
  SYLogger.error(f"[Sandbox] tree 失败: {e}")
627
- return TreeResult(error=str(e))
660
+ return TreeResult(error=f"Path '{path}': {e}")
628
661
 
629
662
  async def atree(self: "HTTPSandboxBackend", path: str = "/", max_depth: int = 30, max_files: int = 0, *, timeout: int = None) -> TreeResult:
630
663
  """异步以树形结构展示目录"""
@@ -639,13 +672,13 @@ class FileOperationsMixin:
639
672
  "max_files": max_files,
640
673
  }, timeout=timeout)
641
674
  if result.get("error"):
642
- return TreeResult(error=result["error"])
675
+ return TreeResult(error=f"Path '{path}': {result['error']}")
643
676
  tree_node = TreeNode(
644
677
  **result["tree"]) if result.get("tree") else None
645
678
  return TreeResult(tree=tree_node)
646
679
  except Exception as e:
647
680
  SYLogger.error(f"[Sandbox] 异步 tree 失败: {e}")
648
- return TreeResult(error=str(e))
681
+ return TreeResult(error=f"Path '{path}': {e}")
649
682
 
650
683
  def grep(
651
684
  self: "HTTPSandboxBackend",
@@ -745,7 +778,12 @@ class FileOperationsMixin:
745
778
  path: str,
746
779
  recursive: bool = False,
747
780
  ) -> DeleteResult:
748
- """删除文件或文件夹"""
781
+ """删除文件或文件夹
782
+
783
+ 错误文案对齐 write 的 "Failed to write file '<path>': ..." 风格,
784
+ 统一为 "Failed to delete '<path>': <reason>",并把服务端错误码
785
+ 归一化(file_not_found / is_directory / permission_denied)。
786
+ """
749
787
  try:
750
788
  self._lazy_sync_skill_from_path_sync(path)
751
789
  self._ensure_synced_sync()
@@ -755,18 +793,15 @@ class FileOperationsMixin:
755
793
  "user_id": self.user_id,
756
794
  "recursive": recursive,
757
795
  })
758
- delete_result = DeleteResult(
759
- path=result.get("path", path),
760
- error=result.get("error"),
761
- )
762
- if delete_result.error:
763
- SYLogger.error(f"[Sandbox] 删除失败: {delete_result.error}")
764
- else:
765
- SYLogger.info(f"[Sandbox] 删除成功: {delete_result.path}")
766
- return delete_result
796
+ err = result.get("error")
797
+ if err:
798
+ err_msg = _DELETE_ERROR_MAP.get(err, err)
799
+ return DeleteResult(path=path, error=f"Failed to delete '{path}': {err_msg}")
800
+ SYLogger.info(f"[Sandbox] 删除成功: {result.get('path', path)}")
801
+ return DeleteResult(path=result.get("path", path), error=None)
767
802
  except Exception as e:
768
803
  SYLogger.error(f"[Sandbox] 删除异常: {e}")
769
- return DeleteResult(path=path, error=str(e))
804
+ return DeleteResult(path=path, error=f"Failed to delete '{path}': {e}")
770
805
 
771
806
  async def adelete(
772
807
  self: "HTTPSandboxBackend",
@@ -780,6 +815,8 @@ class FileOperationsMixin:
780
815
 
781
816
  _skip_lazy_sync=True 时跳过懒同步(供内部技能覆盖删除用,
782
817
  避免「删之前先把要删的技能上传一遍」的浪费)。
818
+
819
+ 错误文案对齐 write/delete:统一 "Failed to delete '<path>': <reason>"。
783
820
  """
784
821
  try:
785
822
  if not _skip_lazy_sync:
@@ -791,18 +828,15 @@ class FileOperationsMixin:
791
828
  "user_id": self.user_id,
792
829
  "recursive": recursive,
793
830
  }, timeout=timeout)
794
- delete_result = DeleteResult(
795
- path=result.get("path", path),
796
- error=result.get("error"),
797
- )
798
- if delete_result.error:
799
- SYLogger.error(f"[Sandbox] 异步删除失败: {delete_result.error}")
800
- else:
801
- SYLogger.info(f"[Sandbox] 异步删除成功: {delete_result.path}")
802
- return delete_result
831
+ err = result.get("error")
832
+ if err:
833
+ err_msg = _DELETE_ERROR_MAP.get(err, err)
834
+ return DeleteResult(path=path, error=f"Failed to delete '{path}': {err_msg}")
835
+ SYLogger.info(f"[Sandbox] 异步删除成功: {result.get('path', path)}")
836
+ return DeleteResult(path=result.get("path", path), error=None)
803
837
  except Exception as e:
804
838
  SYLogger.error(f"[Sandbox] 异步删除异常: {e}")
805
- return DeleteResult(path=path, error=str(e))
839
+ return DeleteResult(path=path, error=f"Failed to delete '{path}': {e}")
806
840
 
807
841
  # ============== 文件存在检查 ==============
808
842
 
@@ -1020,10 +1020,13 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
1020
1020
  "path": remote_path,
1021
1021
  "user_id": self._user_id
1022
1022
  }, timeout=timeout)
1023
- if ls_result and not ls_result.get("error"):
1024
- for item in ls_result.get("files", ls_result.get("children", [])):
1023
+ # /ls 返回可能是 list[FileInfo](成功)或 {"error": ...}(路径不存在)。
1024
+ # 路径不存在时不视为错误——相当于无已有子目录可跳过,走全量同步。
1025
+ items = ls_result if isinstance(ls_result, list) else (ls_result or {}).get("files", [])
1026
+ if ls_result and not (isinstance(ls_result, dict) and ls_result.get("error")):
1027
+ for item in items:
1025
1028
  if item.get("is_dir", False):
1026
- existing_subdirs.add(item.get("name", ""))
1029
+ existing_subdirs.add(item.get("name", item.get("path", "").rstrip("/").split("/")[-1]))
1027
1030
  if existing_subdirs:
1028
1031
  SYLogger.info(
1029
1032
  f"[Sandbox] partial 模式,跳过已有子目录: {existing_subdirs}")
@@ -1398,10 +1401,12 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
1398
1401
  "path": remote_path,
1399
1402
  "user_id": self._user_id
1400
1403
  })
1401
- if ls_result and not ls_result.get("error"):
1402
- for item in ls_result.get("files", ls_result.get("children", [])):
1404
+ # /ls 成功返回 list[FileInfo],路径不存在返回 {"error":...}(不视为错误,走全量)。
1405
+ items = ls_result if isinstance(ls_result, list) else (ls_result or {}).get("files", [])
1406
+ if ls_result and not (isinstance(ls_result, dict) and ls_result.get("error")):
1407
+ for item in items:
1403
1408
  if item.get("is_dir", False):
1404
- existing_subdirs.add(item.get("name", ""))
1409
+ existing_subdirs.add(item.get("name", item.get("path", "").rstrip("/").split("/")[-1]))
1405
1410
  if existing_subdirs:
1406
1411
  SYLogger.info(
1407
1412
  f"[Sandbox] partial 模式,跳过已有子目录: {existing_subdirs}")