sycommon-python-lib 0.2.7a19__tar.gz → 0.2.7a20__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.7a19 → sycommon_python_lib-0.2.7a20}/PKG-INFO +3 -3
  2. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/pyproject.toml +3 -3
  3. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/deep_agent.py +2 -2
  4. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/skill_api_whitelist.py +2 -2
  5. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/file_ops.py +34 -7
  6. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/http_sandbox_backend.py +18 -0
  7. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/minio_sync.py +142 -25
  8. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/sandbox.py +8 -10
  9. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/PKG-INFO +3 -3
  10. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/requires.txt +2 -2
  11. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_sandbox_path_guard.py +2 -2
  12. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/README.md +0 -0
  13. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/setup.cfg +0 -0
  14. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/__init__.py +0 -0
  15. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/cli.py +0 -0
  16. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/core/__init__.py +0 -0
  17. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/core/console.py +0 -0
  18. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/core/models.py +0 -0
  19. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/core/project.py +0 -0
  20. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/core/utils.py +0 -0
  21. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/__init__.py +0 -0
  22. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/README.md.tpl +0 -0
  23. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/__init__.py +0 -0
  24. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  25. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/api/query.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/app.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/db/service.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/model/parse.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  43. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  44. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/.env.tpl +0 -0
  45. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/.gitignore.tpl +0 -0
  46. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/Dockerfile.tpl +0 -0
  47. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/README.md.tpl +0 -0
  48. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/__init__.py +0 -0
  49. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/app.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/app.yaml.tpl +0 -0
  51. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/client/__init__.py.tpl +0 -0
  53. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/model/__init__.py.tpl +0 -0
  54. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/model/file_info.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/requirements.txt.tpl +0 -0
  56. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/README.md.tpl +0 -0
  57. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/__init__.py +0 -0
  58. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/app.py.tpl +0 -0
  59. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  60. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  61. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  62. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/README.md.tpl +0 -0
  64. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/__init__.py +0 -0
  65. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/api/__init__.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/api/echo.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/app.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/client/__init__.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/model/__init__.py.tpl +0 -0
  72. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  73. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/tools/mq.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/nexus/__init__.py +0 -0
  75. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/__init__.py +0 -0
  76. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/__main__.py +0 -0
  77. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/acp/__init__.py +0 -0
  78. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/acp/config.py +0 -0
  79. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/acp/executor.py +0 -0
  80. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/acp/registry.py +0 -0
  81. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/acp/server.py +0 -0
  82. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/agents/__init__.py +0 -0
  83. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/agents/factory.py +0 -0
  84. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/agents/prompts.py +0 -0
  85. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/__init__.py +0 -0
  86. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/browser.py +0 -0
  87. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/__init__.py +0 -0
  88. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/console.py +0 -0
  89. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/dom.py +0 -0
  90. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/network.py +0 -0
  91. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  92. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/performance.py +0 -0
  93. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  94. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/client.py +0 -0
  95. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/protocol.py +0 -0
  96. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/repl.py +0 -0
  97. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/cli.py +0 -0
  98. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/__init__.py +0 -0
  99. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/acp_cmd.py +0 -0
  100. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/cdp_cmd.py +0 -0
  101. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/chat_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/create_cmd.py +0 -0
  103. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/evaluate_cmd.py +0 -0
  104. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/init_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/memory_cmd.py +0 -0
  106. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/resume_cmd.py +0 -0
  107. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/rollback_cmd.py +0 -0
  108. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/run_cmd.py +0 -0
  109. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/core/__init__.py +0 -0
  110. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/core/backend.py +0 -0
  111. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/core/config.py +0 -0
  112. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/core/display.py +0 -0
  113. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/core/git_integration.py +0 -0
  114. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/core/llm.py +0 -0
  115. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/core/state.py +0 -0
  116. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/evaluate/__init__.py +0 -0
  117. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/evaluate/api_evaluator.py +0 -0
  118. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/__init__.py +0 -0
  119. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/compressor.py +0 -0
  120. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/full.py +0 -0
  121. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/hot.py +0 -0
  122. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/manager.py +0 -0
  123. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/warm.py +0 -0
  124. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/mode/__init__.py +0 -0
  125. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/mode/create.py +0 -0
  126. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/mode/optimize.py +0 -0
  127. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/models/__init__.py +0 -0
  128. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/models/config_models.py +0 -0
  129. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/__init__.py +0 -0
  130. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/baseline_tests.py +0 -0
  131. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/checkpoint.py +0 -0
  132. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/convergence.py +0 -0
  133. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/diagnosis.py +0 -0
  134. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/engine.py +0 -0
  135. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/environment.py +0 -0
  136. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/experience.py +0 -0
  137. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/harness_prompts.py +0 -0
  138. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/history.py +0 -0
  139. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/optimization_logger.py +0 -0
  140. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/pre_validation.py +0 -0
  141. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/reward.py +0 -0
  142. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/strategy_bandit.py +0 -0
  143. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/strategy_generator.py +0 -0
  144. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/strategy_prompts.py +0 -0
  145. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/simple_chat_agent.py +0 -0
  146. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycli/skills/__init__.py +0 -0
  147. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/__init__.py +0 -0
  148. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/__init__.py +0 -0
  149. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/acp/__init__.py +0 -0
  150. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/acp/client.py +0 -0
  151. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/acp/fetch.py +0 -0
  152. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/acp/ssh_init.py +0 -0
  153. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/acp/tool.py +0 -0
  154. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/agent_manager.py +0 -0
  155. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/chat_events.py +0 -0
  156. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/mcp/__init__.py +0 -0
  157. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/mcp/models.py +0 -0
  158. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  159. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
  160. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  161. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
  162. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
  163. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  164. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/multi_agent_team.py +0 -0
  165. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/__init__.py +0 -0
  166. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  167. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  168. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  169. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/session.py +0 -0
  170. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/summarization_utils.py +0 -0
  171. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/__init__.py +0 -0
  172. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/ldap_service.py +0 -0
  173. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/oa_cache.py +0 -0
  174. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/oa_crypto.py +0 -0
  175. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/oa_service.py +0 -0
  176. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  177. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/ACPAgentConfig.py +0 -0
  178. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/Config.py +0 -0
  179. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/DatabaseConfig.py +0 -0
  180. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  181. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/EmbeddingConfig.py +0 -0
  182. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/LLMConfig.py +0 -0
  183. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/LangfuseConfig.py +0 -0
  184. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/MQConfig.py +0 -0
  185. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/PgConfig.py +0 -0
  186. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/RedisConfig.py +0 -0
  187. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/RerankerConfig.py +0 -0
  188. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/SentryConfig.py +0 -0
  189. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
  190. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/XxlJobConfig.py +0 -0
  191. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/__init__.py +0 -0
  192. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/config_change_notifier.py +0 -0
  193. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/async_base_db_service.py +0 -0
  194. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/async_database_service.py +0 -0
  195. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/base_db_service.py +0 -0
  196. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/database_service.py +0 -0
  197. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/elasticsearch_service.py +0 -0
  198. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  199. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/redis_service.py +0 -0
  200. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/resilient_pg_saver.py +0 -0
  201. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/token_usage_db_service.py +0 -0
  202. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/health/__init__.py +0 -0
  203. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/health/health_check.py +0 -0
  204. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/health/metrics.py +0 -0
  205. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/health/ping.py +0 -0
  206. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/heartbeat_process/__init__.py +0 -0
  207. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  208. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  209. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  210. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/__init__.py +0 -0
  211. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/embedding.py +0 -0
  212. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/get_llm.py +0 -0
  213. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/llm_logger.py +0 -0
  214. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/llm_tokens.py +0 -0
  215. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  216. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  217. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  218. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/struct_token.py +0 -0
  219. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/sy_langfuse.py +0 -0
  220. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  221. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  222. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/token_usage_es_service.py +0 -0
  223. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  224. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/token_utils.py +0 -0
  225. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/usage_token.py +0 -0
  226. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/__init__.py +0 -0
  227. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/async_sql_logger.py +0 -0
  228. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/kafka_log.py +0 -0
  229. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/log_masker.py +0 -0
  230. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/logger_levels.py +0 -0
  231. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/logger_wrapper.py +0 -0
  232. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/process_logger.py +0 -0
  233. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/sql_logger.py +0 -0
  234. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/mcp_server/__init__.py +0 -0
  235. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/mcp_server/server.py +0 -0
  236. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/__init__.py +0 -0
  237. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/context.py +0 -0
  238. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/cors.py +0 -0
  239. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/docs.py +0 -0
  240. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/exception.py +0 -0
  241. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/middleware.py +0 -0
  242. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/monitor_memory.py +0 -0
  243. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/mq.py +0 -0
  244. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/timeout.py +0 -0
  245. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/token_tracking.py +0 -0
  246. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  247. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/traceid.py +0 -0
  248. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/__init__.py +0 -0
  249. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/base_http.py +0 -0
  250. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/log.py +0 -0
  251. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/mcp_server_config.py +0 -0
  252. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/mqlistener_config.py +0 -0
  253. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/mqmsg_model.py +0 -0
  254. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/mqsend_config.py +0 -0
  255. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/sandbox.py +0 -0
  256. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/sso_user.py +0 -0
  257. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/token_usage.py +0 -0
  258. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/token_usage_mysql.py +0 -0
  259. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/xxljob_handler_config.py +0 -0
  260. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/notice/__init__.py +0 -0
  261. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  262. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/notice/wecom_message.py +0 -0
  263. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  264. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  265. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  266. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  267. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  268. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  269. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  270. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  271. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  272. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/sentry/__init__.py +0 -0
  273. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/sentry/sy_sentry.py +0 -0
  274. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/services.py +0 -0
  275. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/sse/__init__.py +0 -0
  276. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/sse/event.py +0 -0
  277. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/sse/sse.py +0 -0
  278. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/__init__.py +0 -0
  279. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/example.py +0 -0
  280. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/example2.py +0 -0
  281. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/feign.py +0 -0
  282. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/feign_client.py +0 -0
  283. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_client_base.py +0 -0
  284. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  285. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  286. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_service.py +0 -0
  287. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  288. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  289. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/param.py +0 -0
  290. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/deep_agent_server.py +0 -0
  291. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_consistent_hash.py +0 -0
  292. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  293. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  294. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_deep_agent.py +0 -0
  295. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  296. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_email.py +0 -0
  297. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_encoding_cache.py +0 -0
  298. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_fix_verification.py +0 -0
  299. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_mcp_server.py +0 -0
  300. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  301. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_mq.py +0 -0
  302. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_oa_login.py +0 -0
  303. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  304. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_real_summarization.py +0 -0
  305. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_summarization_config.py +0 -0
  306. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_summarization_real.py +0 -0
  307. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  308. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/__init__.py +0 -0
  309. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/async_utils.py +0 -0
  310. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/docs.py +0 -0
  311. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/env.py +0 -0
  312. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/merge_headers.py +0 -0
  313. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/snowflake.py +0 -0
  314. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/syemail.py +0 -0
  315. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/timing.py +0 -0
  316. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/xxljob/__init__.py +0 -0
  317. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon/xxljob/xxljob_service.py +0 -0
  318. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -0
  319. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  320. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  321. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  322. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_acp_tool.py +0 -0
  323. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_asyncio_logging.py +0 -0
  324. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_config_change_notifier.py +0 -0
  325. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_hotreload_snapshot.py +0 -0
  326. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_llm_apikey_contextvar.py +0 -0
  327. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_log_masker.py +0 -0
  328. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_resilient_pg_saver.py +0 -0
  329. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_sensitive_guard.py +0 -0
  330. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_simple_chat_agent.py +0 -0
  331. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_skill_regex_upgrade.py +0 -0
  332. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_skill_write_guard.py +0 -0
  333. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/tests/test_sycli.py +0 -0
  334. {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a20}/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.7a19
3
+ Version: 0.2.7a20
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -18,7 +18,7 @@ Requires-Dist: langchain==1.3.11
18
18
  Requires-Dist: langchain-core==1.4.8
19
19
  Requires-Dist: langchain-openai==1.3.3
20
20
  Requires-Dist: langfuse==4.13.0
21
- Requires-Dist: langgraph==1.2.7
21
+ Requires-Dist: langgraph==1.2.8
22
22
  Requires-Dist: langgraph-checkpoint-postgres==3.1.0
23
23
  Requires-Dist: langgraph-checkpoint-redis==0.5.0
24
24
  Requires-Dist: ldap3==2.9.1
@@ -43,7 +43,7 @@ Requires-Dist: minio==7.2.20
43
43
  Requires-Dist: langchain-mcp-adapters==0.3.0
44
44
  Requires-Dist: fastapi-mcp==0.4.0
45
45
  Requires-Dist: psycopg[binary,pool]==3.3.4
46
- Requires-Dist: agent-client-protocol==0.10.1
46
+ Requires-Dist: agent-client-protocol==0.11.0
47
47
 
48
48
  # sycommon-python-lib
49
49
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.7a19"
3
+ version = "0.2.7a20"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -19,7 +19,7 @@ dependencies = [
19
19
  "langchain-core==1.4.8",
20
20
  "langchain-openai==1.3.3",
21
21
  "langfuse==4.13.0",
22
- "langgraph==1.2.7",
22
+ "langgraph==1.2.8",
23
23
  "langgraph-checkpoint-postgres==3.1.0",
24
24
  "langgraph-checkpoint-redis==0.5.0",
25
25
  "ldap3==2.9.1",
@@ -44,7 +44,7 @@ dependencies = [
44
44
  "langchain-mcp-adapters==0.3.0",
45
45
  "fastapi-mcp==0.4.0",
46
46
  "psycopg[binary,pool]==3.3.4",
47
- "agent-client-protocol==0.10.1",
47
+ "agent-client-protocol==0.11.0",
48
48
  ]
49
49
 
50
50
  [tool.setuptools]
@@ -1485,9 +1485,9 @@ async def _sync_skills_to_sandbox(
1485
1485
  if chmod_readonly:
1486
1486
  try:
1487
1487
  # sandbox_dest 是虚拟绝对路径(/skills/system),沙箱 shell 不重映射裸绝对路径,
1488
- # 须拼 $_SANDBOX_WORKSPACE 指向真实 workspace 才能命中。否则 chmod 静默失败。
1488
+ # 须拼 $SANDBOX_ROOT 指向真实 workspace 才能命中。否则 chmod 静默失败。
1489
1489
  await backend.aexecute(
1490
- f'chmod -R 555 "$_SANDBOX_WORKSPACE{sandbox_dest}"',
1490
+ f'chmod -R 555 "$SANDBOX_ROOT{sandbox_dest}"',
1491
1491
  _skip_lazy_sync=True)
1492
1492
  SYLogger.info(f"[DeepAgent] 已设只读: chmod -R 555 {sandbox_dest}")
1493
1493
  except Exception as e:
@@ -47,8 +47,8 @@ _PUSH_FILES = [
47
47
  ("sitecustomize.py", ".wl/sitecustomize.py"),
48
48
  ("skill_wl_check.py", ".wl/skill_wl_check.py"),
49
49
  ]
50
- # workspace 内白名单目录的 shell 形式(init_script 已 export $_SANDBOX_WORKSPACE,运行期展开)
51
- _WL_DIR = "$_SANDBOX_WORKSPACE/.wl"
50
+ # workspace 内白名单目录的 shell 形式(init_script 已 export $SANDBOX_ROOT,运行期展开)
51
+ _WL_DIR = "$SANDBOX_ROOT/.wl"
52
52
 
53
53
 
54
54
  def _resolve_placeholders(pattern: str, env_lookup) -> Optional[str]:
@@ -94,6 +94,30 @@ def _normalize_edit_error(error: str, file_path: str, old_string: str) -> str:
94
94
  return messages.get(code, error)
95
95
 
96
96
 
97
+ # read 工具返回的“良性错误”关键词——这些是 agent 正常的文件探索/分页试探,
98
+ # 不是系统故障。降级为 warning 而非 ERROR,避免淹没真正的错误日志。
99
+ # 文案与 sycommon/middleware/sandbox.py 服务端 read 的错误返回对齐。
100
+ _BENIGN_READ_ERROR_MARKERS = (
101
+ "not found", # agent 试探性读取不存在的路径
102
+ "outside the sandbox", # 安全守卫拦截宿主绝对路径,agent 会自愈改用虚拟路径
103
+ "exceeds maximum preview size", # 二进制文件超 500KiB,agent 在探索文件结构
104
+ "exceeds file length", # 分页 offset 超出文件实际行数,agent 翻页越界
105
+ "empty contents", # 空文件提示
106
+ )
107
+
108
+
109
+ def _is_benign_read_error(err_msg: str) -> bool:
110
+ """判断 read 错误是否为 agent 正常工具行为(应降级为 warning 而非 ERROR)。
111
+
112
+ 这些都是 LLM 探索文件系统时的正常试探/边界:路径不存在、宿主绝对路径、
113
+ 大二进制文件、分页越界、空文件。若全刷成 ERROR 会淹没真正的异常日志。
114
+ """
115
+ if not err_msg:
116
+ return False
117
+ low = err_msg.lower()
118
+ return any(marker in low for marker in _BENIGN_READ_ERROR_MARKERS)
119
+
120
+
97
121
  @dataclass
98
122
  class TreeResult:
99
123
  """tree 操作结果"""
@@ -311,8 +335,12 @@ class FileOperationsMixin:
311
335
  detail = str(result)[:200] if result else "(empty)"
312
336
  return ReadResult(error=f"File '{file_path}': unexpected server response: {detail}")
313
337
  if result.get("error"):
314
- SYLogger.error(f"[Sandbox] 读取文件失败: {result['error']}")
315
- return ReadResult(error=f"File '{file_path}': {result['error']}")
338
+ err_msg = result['error']
339
+ if _is_benign_read_error(err_msg):
340
+ SYLogger.warning(f"[Sandbox] 读取文件未命中(良性): {err_msg}")
341
+ else:
342
+ SYLogger.error(f"[Sandbox] 读取文件失败: {err_msg}")
343
+ return ReadResult(error=f"File '{file_path}': {err_msg}")
316
344
  content = result.get("content", "")
317
345
  encoding = result.get("encoding", "utf-8")
318
346
  SYLogger.info(
@@ -361,11 +389,10 @@ class FileOperationsMixin:
361
389
  return ReadResult(error=f"File '{file_path}': unexpected server response: {detail}")
362
390
  if result.get("error"):
363
391
  err_msg = result['error']
364
- if 'not found' in err_msg or 'outside the sandbox' in err_msg:
365
- # not found 是 agent 正常试探;outside the sandbox 是安全守卫拦截
366
- # agent 用了宿主绝对路径,属正常 tool-error(会自愈改用虚拟路径)。
367
- # 降级为 warning,避免把正常工具错误刷成 ERROR 级。
368
- SYLogger.warning(f"[Sandbox] 异步读取文件未找到: {err_msg}")
392
+ if _is_benign_read_error(err_msg):
393
+ # _is_benign_read_error:agent 正常的文件探索/分页试探,
394
+ # 降级为 warning 避免淹没真正的异常日志。
395
+ SYLogger.warning(f"[Sandbox] 异步读取文件未命中(良性): {err_msg}")
369
396
  else:
370
397
  SYLogger.error(f"[Sandbox] 异步读取文件失败: {err_msg}")
371
398
  return ReadResult(error=f"File '{file_path}': {err_msg}")
@@ -473,6 +473,24 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
473
473
  SYLogger.info(
474
474
  f"[Sandbox] MinIO 恢复完成: {restored} 个文件")
475
475
  finally:
476
+ # restore_from_minio 复用了共享 backend self,内部经
477
+ # aupload_files -> _get_async_session() 的 loop 不匹配逻辑,
478
+ # 会在【本临时 loop】上惰性创建 aiohttp ClientSession。
479
+ # 临时 loop 关闭前必须把这个 session 关掉,否则 loop.close()
480
+ # 后它成为孤儿,aiohttp GC 时刷
481
+ # "Unclosed client session" / "Unclosed connector"。
482
+ # 仅当 session 确实绑定在本临时 loop 上才动它
483
+ # (restore 若是空操作则 self._async_session 仍是主 loop 的,不能误关)。
484
+ if (self._async_session is not None
485
+ and not self._async_session.closed
486
+ and self._session_loop_id == id(loop)):
487
+ try:
488
+ loop.run_until_complete(
489
+ self._async_session.close())
490
+ except Exception:
491
+ pass
492
+ self._async_session = None
493
+ self._session_loop_id = None
476
494
  loop.close()
477
495
  except Exception as e:
478
496
  SYLogger.warning(
@@ -292,28 +292,30 @@ class MinioSyncService(metaclass=SingletonMeta):
292
292
 
293
293
  # ============== 批量扫描同步 ==============
294
294
 
295
- def collect_sandbox_files(self, tree_result) -> list[str]:
296
- """从沙箱 tree 结果中收集所有文件路径
295
+ def collect_sandbox_files(self, tree_result) -> dict[str, int]:
296
+ """从沙箱 tree 结果收集 {文件路径: 大小}。
297
297
 
298
- tree 根节点 name 通常是 user_id(如 "osulcode.xiao"),
299
- 收集时跳过根节点,从其 children 开始递归,这样路径不含 user_id 前缀,
300
- astat/adownload_files 的路径语义一致。
298
+ tree 根节点 name 通常是 user_id(如 "osulcode.xiao"),收集时跳过根节点,
299
+ children 开始递归,路径不含 user_id 前缀,与 astat/adownload_files 语义一致。
300
+ size 取节点 .size,缺失记为 -1(表示「未知」,diff 时按「可能变化」处理,即重传)。
301
+
302
+ 用 size 做 diff 是为了让「会话中途直推过、随后 agent 原地改写」的文件能在
303
+ 会话末尾扫描时被重新同步(否则路径已存在会被当成无变化忽略,丢掉改写后的版本)。
301
304
  """
302
305
  if tree_result.error or not tree_result.tree:
303
- return []
306
+ return {}
304
307
 
305
308
  root = tree_result.tree
306
- files = []
309
+ files: dict[str, int] = {}
307
310
  if root.is_dir and root.children:
308
311
  for child in root.children:
309
312
  self._collect_files_from_node(child, "", files)
310
313
 
311
- # tree 在文件过多时会插入 "... (truncated, max N files)" 虚拟节点,过滤掉
312
- files = [f for f in files if "truncated" not in f]
313
- return files
314
+ # tree 文件过多时插入 "... (truncated, max N files)" 虚拟节点,过滤掉
315
+ return {fp: sz for fp, sz in files.items() if "truncated" not in fp}
314
316
 
315
- def _collect_files_from_node(self, node, prefix: str, files: list):
316
- """递归收集文件节点"""
317
+ def _collect_files_from_node(self, node, prefix: str, files: dict[str, int]):
318
+ """递归收集文件节点到 {path: size}"""
317
319
  if not node:
318
320
  return
319
321
 
@@ -324,21 +326,26 @@ class MinioSyncService(metaclass=SingletonMeta):
324
326
  for child in node.children:
325
327
  self._collect_files_from_node(child, path, files)
326
328
  else:
327
- files.append(path)
329
+ # size 缺失(None)记为 -1,diff 时按「可能变化」处理,避免漏传
330
+ size = node.size if node.size is not None else -1
331
+ files[path] = size
328
332
 
329
- def _exclude_system_skills(self, files: list[str]) -> list[str]:
333
+ def _exclude_system_skills(self, files) -> list[str]:
330
334
  """过滤掉 /skills/system/ 前缀文件——system 是只读仓库产物,不进 MinIO。
331
335
 
332
336
  路径形如 skills/system/sy-oa-skill/...(collect_sandbox_files 已 strip 根 user_id
333
337
  前缀,根盘符 / 由调用方拼接)。兼容带不带前导斜杠。
338
+
339
+ files 可为 dict({path:size})或 list[str]:dict 时按 key 过滤并返回新 dict,
340
+ list 时按元素过滤并返回新 list。
334
341
  """
335
- out = []
336
- for fp in files:
342
+ def _keep(fp):
337
343
  norm = fp.replace("\\", "/").lstrip("/")
338
- if norm == "skills/system" or norm.startswith("skills/system/"):
339
- continue
340
- out.append(fp)
341
- return out
344
+ return not (norm == "skills/system" or norm.startswith("skills/system/"))
345
+
346
+ if isinstance(files, dict):
347
+ return {fp: sz for fp, sz in files.items() if _keep(fp)}
348
+ return [fp for fp in files if _keep(fp)]
342
349
 
343
350
  async def sync_sandbox_to_minio(self, sandbox_backend, user_id: str) -> int:
344
351
  """扫描沙箱目录,增量同步文件到 MinIO
@@ -390,7 +397,7 @@ class MinioSyncService(metaclass=SingletonMeta):
390
397
 
391
398
  prefix = f"{user_id.lower()}/{dir_name}/"
392
399
 
393
- # 3. 获取 MinIO 已有副本
400
+ # 3. 获取 MinIO 已有副本({相对路径: MinioObject},取其 .size 做 diff)
394
401
  existing_objects = {}
395
402
  try:
396
403
  objects = await asyncio.to_thread(
@@ -403,14 +410,21 @@ class MinioSyncService(metaclass=SingletonMeta):
403
410
  except Exception as e:
404
411
  SYLogger.warning(f"[MinIO] 列出已有副本失败,将全量上传: {e}")
405
412
 
406
- # 4. 找出需要同步的文件(新增的不在 MinIO 中)
407
- sandbox_file_set = set(sandbox_files)
413
+ # 4. 找出需要同步的文件:
414
+ # - MinIO 中没有(新增)
415
+ # - 或 MinIO 有但 size 不一致(被改写,含「中途直推过初版、随后改写」的场景)
416
+ # 注意 sandbox size 未知(-1)一律视为变化,宁可重传也不漏传。
408
417
  changed_files = [
409
- fp for fp in sandbox_files if fp not in existing_objects]
418
+ fp for fp, sz in sandbox_files.items()
419
+ if fp not in existing_objects
420
+ or sz < 0
421
+ or existing_objects[fp].size != sz
422
+ ]
410
423
 
411
424
  # 5. 找出需要删除的文件(MinIO 中存在但沙箱中已不存在)
412
425
  deleted_files = [
413
- fp for fp in existing_objects if fp not in sandbox_file_set]
426
+ fp for fp in existing_objects if fp not in sandbox_files
427
+ ]
414
428
 
415
429
  # 删除 MinIO 中的孤立文件
416
430
  if deleted_files:
@@ -486,6 +500,109 @@ class MinioSyncService(metaclass=SingletonMeta):
486
500
  SYLogger.warning(f"[MinIO] 同步文件异常: {fp}, error={e}")
487
501
  return False
488
502
 
503
+ # ============== 用户上传文件直推(fire-and-forget 后台)==============
504
+ # 用户刚传上来的文件优先落 MinIO:不等会话结束扫描,免得沙箱中途崩溃丢文件。
505
+ # 这两条只做“上传”,不删孤儿、不扫描;会话末尾的全量扫描仍负责 diff/清理。
506
+ _background_tasks: set = set()
507
+
508
+ @staticmethod
509
+ def make_user_file_key(user_id: str, file_path: str) -> str:
510
+ """构造 {user_id}/current/{path} 的 object key(对外共用,调用方也用得上)"""
511
+ clean = file_path.replace("\\", "/").lstrip("./").lstrip("/")
512
+ return f"{user_id.lower()}/current/{clean}"
513
+
514
+ def _push_batch_sync(self, user_id: str, files: list[tuple[str, bytes]]) -> int:
515
+ """同步直推一批已落盘的用户文件到 MinIO(阻塞,跑在后台线程)
516
+
517
+ files: [(相对路径, 文件内容), ...],相对路径不带前导 /(与沙箱根语义一致)。
518
+ 返回成功条数。逐文件做,单文件失败不影响其余。
519
+ """
520
+ if not self._client:
521
+ return 0
522
+ ok = 0
523
+ for fp, content in files:
524
+ object_key = self.make_user_file_key(user_id, fp)
525
+ mime_type, _ = mimetypes.guess_type(fp)
526
+ if self.upload_bytes(
527
+ object_key, content,
528
+ content_type=mime_type or "application/octet-stream",
529
+ ):
530
+ ok += 1
531
+ return ok
532
+
533
+ async def _push_batch_async(self, user_id: str, files: list[tuple[str, bytes]]) -> int:
534
+ """异步直推一批用户文件:并发上传,单文件失败不影响其余。
535
+
536
+ 并发 cap 与全量同步的 CONCURRENT_BATCH 对齐(5),避免突发上传打满 MinIO。
537
+ """
538
+ if not self._client:
539
+ return 0
540
+ if not files:
541
+ return 0
542
+
543
+ async def _one(fp, content):
544
+ object_key = self.make_user_file_key(user_id, fp)
545
+ mime_type, _ = mimetypes.guess_type(fp)
546
+ return await self.aupload_bytes(
547
+ object_key, content,
548
+ content_type=mime_type or "application/octet-stream",
549
+ )
550
+
551
+ results = await asyncio.gather(
552
+ *(_one(fp, c) for fp, c in files), return_exceptions=True
553
+ )
554
+ return sum(1 for r in results if r is True)
555
+
556
+ def push_user_files_batch(self, user_id: str, files: list[tuple[str, bytes]]) -> None:
557
+ """用户上传后立即 fire-and-forget 直推 MinIO(首选入口,安全无副作用)。
558
+
559
+ 在独立后台线程/事件循环上跑,绝不阻塞调用方(上传响应/聊天)。MinIO 不可用
560
+ 或上传失败都不影响主流程,只记日志——会话末尾的全量扫描会兜底。
561
+ 保持对 _background_tasks 的强引用,防止 GC 提前回收正在跑的任务。
562
+ """
563
+ if not self.is_available():
564
+ return
565
+ # 去掉空内容/空路径,并 strip 前导斜杠与 ./
566
+ norm = []
567
+ for fp, content in files:
568
+ if not fp or content is None:
569
+ continue
570
+ clean = fp.replace("\\", "/").lstrip("./").lstrip("/")
571
+ if not clean:
572
+ continue
573
+ norm.append((clean, content))
574
+ if not norm:
575
+ return
576
+
577
+ # 逐个 upload_bytes 是同步 minio SDK 调用,丢到线程里做更省事也更稳;
578
+ # 这里用一整批一个 to_thread 而不是每文件一个,减少线程调度开销。
579
+ async def _run():
580
+ try:
581
+ ok = await asyncio.to_thread(self._push_batch_sync, user_id, norm)
582
+ SYLogger.info(
583
+ f"[MinIO] 用户文件已直推: user={user_id}, ok={ok}/{len(norm)}")
584
+ except Exception as e:
585
+ SYLogger.warning(f"[MinIO] 用户文件直推失败(不影响主流程): user={user_id}, error={e}")
586
+
587
+ try:
588
+ coro = _run()
589
+ self._background_tasks.add(coro)
590
+ coro.add_done_callback(self._background_tasks.discard)
591
+ asyncio.ensure_future(coro)
592
+ except RuntimeError:
593
+ # 无运行中的事件循环(极少数调用上下文),退化为后台线程兜底
594
+ import threading
595
+ def _bg():
596
+ try:
597
+ ok = self._push_batch_sync(user_id, norm)
598
+ SYLogger.info(
599
+ f"[MinIO] 用户文件已直推(bg-thread): user={user_id}, ok={ok}/{len(norm)}")
600
+ except Exception as e:
601
+ SYLogger.warning(f"[MinIO] 用户文件直推失败(bg): user={user_id}, error={e}")
602
+ threading.Thread(
603
+ target=_bg, name=f"minio-userpush-{user_id}", daemon=True
604
+ ).start()
605
+
489
606
  # ============== 反向同步(MinIO → 沙箱) ==============
490
607
 
491
608
  async def restore_from_minio(self, sandbox_backend, user_id: str) -> int:
@@ -136,7 +136,6 @@ def _build_init_script(workspace: str) -> str:
136
136
  safe_workspace = workspace.replace("'", "''")
137
137
  return f'''
138
138
  $env:SANDBOX_ROOT = '{safe_workspace}'
139
- $env:_SANDBOX_WORKSPACE = '{safe_workspace}'
140
139
  Set-Location '{safe_workspace}'
141
140
  '''
142
141
 
@@ -144,7 +143,6 @@ Set-Location '{safe_workspace}'
144
143
  return f'''
145
144
  # 沙箱环境初始化
146
145
  export SANDBOX_ROOT={safe_workspace}
147
- export _SANDBOX_WORKSPACE={safe_workspace}
148
146
 
149
147
  # 资源限制(防止失控进程)
150
148
  ulimit -f 1048576 2>/dev/null # 单文件最大 1GB
@@ -154,7 +152,7 @@ ulimit -c 0 2>/dev/null # 禁止 core dump
154
152
  sandbox_path() {{
155
153
  local path="$1"
156
154
  # 如果路径已经在 workspace 内,直接返回
157
- if [[ "$path" == "$_SANDBOX_WORKSPACE"* ]]; then
155
+ if [[ "$path" == "$SANDBOX_ROOT"* ]]; then
158
156
  echo "$path"
159
157
  return
160
158
  fi
@@ -162,7 +160,7 @@ sandbox_path() {{
162
160
  if [[ "$path" == /* ]]; then
163
161
  # 移除开头的 /
164
162
  path="${{path#/}}"
165
- echo "$_SANDBOX_WORKSPACE/$path"
163
+ echo "$SANDBOX_ROOT/$path"
166
164
  else
167
165
  # 相对路径,基于当前目录
168
166
  echo "$path"
@@ -173,13 +171,13 @@ sandbox_path() {{
173
171
  cd() {{
174
172
  local target="$1"
175
173
  if [[ -z "$target" ]]; then
176
- command cd "$_SANDBOX_WORKSPACE"
177
- elif [[ "$target" == "$_SANDBOX_WORKSPACE"* ]]; then
174
+ command cd "$SANDBOX_ROOT"
175
+ elif [[ "$target" == "$SANDBOX_ROOT"* ]]; then
178
176
  # 路径已经在 workspace 内,直接 cd
179
177
  command cd "$target"
180
178
  elif [[ "$target" == /* ]]; then
181
179
  # 其他绝对路径映射到沙箱内
182
- local mapped="$_SANDBOX_WORKSPACE/${{target#/}}"
180
+ local mapped="$SANDBOX_ROOT/${{target#/}}"
183
181
  command cd "$mapped"
184
182
  else
185
183
  command cd "$target"
@@ -191,11 +189,11 @@ mkdir() {{
191
189
  local args=("$@")
192
190
  local new_args=()
193
191
  for arg in "${{args[@]}}"; do
194
- if [[ "$arg" == "$_SANDBOX_WORKSPACE"* ]]; then
192
+ if [[ "$arg" == "$SANDBOX_ROOT"* ]]; then
195
193
  # 路径已经在 workspace 内,直接使用
196
194
  new_args+=("$arg")
197
195
  elif [[ "$arg" == /* ]]; then
198
- new_args+=("$_SANDBOX_WORKSPACE/${{arg#/}}")
196
+ new_args+=("$SANDBOX_ROOT/${{arg#/}}")
199
197
  else
200
198
  new_args+=("$arg")
201
199
  fi
@@ -204,7 +202,7 @@ mkdir() {{
204
202
  }}
205
203
 
206
204
  # 切换到 workspace 目录
207
- cd "$_SANDBOX_WORKSPACE"
205
+ cd "$SANDBOX_ROOT"
208
206
  '''
209
207
 
210
208
  def _sanitize_user_id(user_id: str) -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.7a19
3
+ Version: 0.2.7a20
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -18,7 +18,7 @@ Requires-Dist: langchain==1.3.11
18
18
  Requires-Dist: langchain-core==1.4.8
19
19
  Requires-Dist: langchain-openai==1.3.3
20
20
  Requires-Dist: langfuse==4.13.0
21
- Requires-Dist: langgraph==1.2.7
21
+ Requires-Dist: langgraph==1.2.8
22
22
  Requires-Dist: langgraph-checkpoint-postgres==3.1.0
23
23
  Requires-Dist: langgraph-checkpoint-redis==0.5.0
24
24
  Requires-Dist: ldap3==2.9.1
@@ -43,7 +43,7 @@ Requires-Dist: minio==7.2.20
43
43
  Requires-Dist: langchain-mcp-adapters==0.3.0
44
44
  Requires-Dist: fastapi-mcp==0.4.0
45
45
  Requires-Dist: psycopg[binary,pool]==3.3.4
46
- Requires-Dist: agent-client-protocol==0.10.1
46
+ Requires-Dist: agent-client-protocol==0.11.0
47
47
 
48
48
  # sycommon-python-lib
49
49
 
@@ -12,7 +12,7 @@ langchain==1.3.11
12
12
  langchain-core==1.4.8
13
13
  langchain-openai==1.3.3
14
14
  langfuse==4.13.0
15
- langgraph==1.2.7
15
+ langgraph==1.2.8
16
16
  langgraph-checkpoint-postgres==3.1.0
17
17
  langgraph-checkpoint-redis==0.5.0
18
18
  ldap3==2.9.1
@@ -37,4 +37,4 @@ minio==7.2.20
37
37
  langchain-mcp-adapters==0.3.0
38
38
  fastapi-mcp==0.4.0
39
39
  psycopg[binary,pool]==3.3.4
40
- agent-client-protocol==0.10.1
40
+ agent-client-protocol==0.11.0
@@ -253,7 +253,7 @@ async def test_execute_host_abs_path_denied(workspace):
253
253
 
254
254
  @pytest.mark.asyncio
255
255
  async def test_execute_relative_allowed(workspace):
256
- """execute 用相对路径 / 虚拟路径 / $_SANDBOX_WORKSPACE → 放行。"""
256
+ """execute 用相对路径 / 虚拟路径 / $SANDBOX_ROOT → 放行。"""
257
257
  mw = SandboxPathGuardMiddleware("osulcode.xiao")
258
258
 
259
259
  async def handler(req):
@@ -261,7 +261,7 @@ async def test_execute_relative_allowed(workspace):
261
261
 
262
262
  for cmd in ["cat ./SKILL.md",
263
263
  "python /skills/system/x/scripts/run.py",
264
- "head $_SANDBOX_WORKSPACE/skills/x.py",
264
+ "head $SANDBOX_ROOT/skills/x.py",
265
265
  "ls /etc"]:
266
266
  res = await mw.awrap_tool_call(_req("execute", {"command": cmd}), handler)
267
267
  assert res == "REACHED", f"误拦了正常命令: {cmd}"