sycommon-python-lib 0.2.7a10__tar.gz → 0.2.7a12__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 (331) hide show
  1. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/PKG-INFO +6 -6
  2. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/pyproject.toml +6 -6
  3. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/deep_agent.py +52 -27
  4. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/file_ops.py +16 -4
  5. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/http_sandbox_backend.py +6 -2
  6. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/get_llm.py +11 -1
  7. sycommon_python_lib-0.2.7a12/src/sycommon/middleware/context.py +16 -0
  8. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/PKG-INFO +6 -6
  9. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/SOURCES.txt +2 -1
  10. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/requires.txt +5 -5
  11. sycommon_python_lib-0.2.7a12/tests/test_sync_skills_to_sandbox.py +207 -0
  12. sycommon_python_lib-0.2.7a10/src/sycommon/middleware/context.py +0 -9
  13. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/README.md +0 -0
  14. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/setup.cfg +0 -0
  15. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/__init__.py +0 -0
  16. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/cli.py +0 -0
  17. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/core/__init__.py +0 -0
  18. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/core/console.py +0 -0
  19. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/core/models.py +0 -0
  20. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/core/project.py +0 -0
  21. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/core/utils.py +0 -0
  22. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/__init__.py +0 -0
  23. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/README.md.tpl +0 -0
  24. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/__init__.py +0 -0
  25. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/api/query.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/app.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/db/service.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/model/parse.py.tpl +0 -0
  43. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  44. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  45. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/.env.tpl +0 -0
  46. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/.gitignore.tpl +0 -0
  47. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/Dockerfile.tpl +0 -0
  48. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/README.md.tpl +0 -0
  49. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/__init__.py +0 -0
  50. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/app.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/app.yaml.tpl +0 -0
  52. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  53. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/client/__init__.py.tpl +0 -0
  54. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/model/__init__.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/model/file_info.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/requirements.txt.tpl +0 -0
  57. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/README.md.tpl +0 -0
  58. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/__init__.py +0 -0
  59. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/app.py.tpl +0 -0
  60. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  61. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  62. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  63. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/README.md.tpl +0 -0
  65. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/__init__.py +0 -0
  66. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/api/__init__.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/api/echo.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/app.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/client/__init__.py.tpl +0 -0
  72. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/model/__init__.py.tpl +0 -0
  73. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/tools/mq.py.tpl +0 -0
  75. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/nexus/__init__.py +0 -0
  76. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/__init__.py +0 -0
  77. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/__main__.py +0 -0
  78. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/acp/__init__.py +0 -0
  79. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/acp/config.py +0 -0
  80. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/acp/executor.py +0 -0
  81. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/acp/registry.py +0 -0
  82. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/acp/server.py +0 -0
  83. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/agents/__init__.py +0 -0
  84. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/agents/factory.py +0 -0
  85. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/agents/prompts.py +0 -0
  86. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/__init__.py +0 -0
  87. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/browser.py +0 -0
  88. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/__init__.py +0 -0
  89. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/console.py +0 -0
  90. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/dom.py +0 -0
  91. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/network.py +0 -0
  92. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  93. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/performance.py +0 -0
  94. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  95. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/client.py +0 -0
  96. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/protocol.py +0 -0
  97. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/repl.py +0 -0
  98. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cli.py +0 -0
  99. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/__init__.py +0 -0
  100. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/acp_cmd.py +0 -0
  101. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/cdp_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/chat_cmd.py +0 -0
  103. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/create_cmd.py +0 -0
  104. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/evaluate_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/init_cmd.py +0 -0
  106. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/memory_cmd.py +0 -0
  107. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/resume_cmd.py +0 -0
  108. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/rollback_cmd.py +0 -0
  109. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/run_cmd.py +0 -0
  110. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/__init__.py +0 -0
  111. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/backend.py +0 -0
  112. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/config.py +0 -0
  113. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/display.py +0 -0
  114. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/git_integration.py +0 -0
  115. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/llm.py +0 -0
  116. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/state.py +0 -0
  117. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/evaluate/__init__.py +0 -0
  118. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/evaluate/api_evaluator.py +0 -0
  119. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/__init__.py +0 -0
  120. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/compressor.py +0 -0
  121. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/full.py +0 -0
  122. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/hot.py +0 -0
  123. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/manager.py +0 -0
  124. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/warm.py +0 -0
  125. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/mode/__init__.py +0 -0
  126. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/mode/create.py +0 -0
  127. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/mode/optimize.py +0 -0
  128. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/models/__init__.py +0 -0
  129. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/models/config_models.py +0 -0
  130. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/__init__.py +0 -0
  131. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/baseline_tests.py +0 -0
  132. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/checkpoint.py +0 -0
  133. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/convergence.py +0 -0
  134. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/diagnosis.py +0 -0
  135. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/engine.py +0 -0
  136. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/environment.py +0 -0
  137. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/experience.py +0 -0
  138. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/harness_prompts.py +0 -0
  139. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/history.py +0 -0
  140. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/optimization_logger.py +0 -0
  141. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/pre_validation.py +0 -0
  142. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/reward.py +0 -0
  143. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/strategy_bandit.py +0 -0
  144. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/strategy_generator.py +0 -0
  145. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/strategy_prompts.py +0 -0
  146. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/simple_chat_agent.py +0 -0
  147. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/skills/__init__.py +0 -0
  148. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/__init__.py +0 -0
  149. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/__init__.py +0 -0
  150. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/acp/__init__.py +0 -0
  151. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/acp/client.py +0 -0
  152. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/acp/fetch.py +0 -0
  153. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/acp/ssh_init.py +0 -0
  154. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/acp/tool.py +0 -0
  155. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/agent_manager.py +0 -0
  156. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/chat_events.py +0 -0
  157. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/mcp/__init__.py +0 -0
  158. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/mcp/models.py +0 -0
  159. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  160. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
  161. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
  162. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
  163. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  164. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/multi_agent_team.py +0 -0
  165. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/__init__.py +0 -0
  166. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  167. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  168. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  169. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  170. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/session.py +0 -0
  171. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/summarization_utils.py +0 -0
  172. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/__init__.py +0 -0
  173. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/ldap_service.py +0 -0
  174. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/oa_cache.py +0 -0
  175. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/oa_crypto.py +0 -0
  176. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/oa_service.py +0 -0
  177. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  178. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/ACPAgentConfig.py +0 -0
  179. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/Config.py +0 -0
  180. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/DatabaseConfig.py +0 -0
  181. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  182. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/EmbeddingConfig.py +0 -0
  183. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/LLMConfig.py +0 -0
  184. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/LangfuseConfig.py +0 -0
  185. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/MQConfig.py +0 -0
  186. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/PgConfig.py +0 -0
  187. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/RedisConfig.py +0 -0
  188. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/RerankerConfig.py +0 -0
  189. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/SentryConfig.py +0 -0
  190. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
  191. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/XxlJobConfig.py +0 -0
  192. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/__init__.py +0 -0
  193. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/config_change_notifier.py +0 -0
  194. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/async_base_db_service.py +0 -0
  195. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/async_database_service.py +0 -0
  196. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/base_db_service.py +0 -0
  197. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/database_service.py +0 -0
  198. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/elasticsearch_service.py +0 -0
  199. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  200. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/redis_service.py +0 -0
  201. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/resilient_pg_saver.py +0 -0
  202. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/token_usage_db_service.py +0 -0
  203. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/health/__init__.py +0 -0
  204. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/health/health_check.py +0 -0
  205. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/health/metrics.py +0 -0
  206. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/health/ping.py +0 -0
  207. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/heartbeat_process/__init__.py +0 -0
  208. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  209. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  210. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  211. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/__init__.py +0 -0
  212. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/embedding.py +0 -0
  213. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/llm_logger.py +0 -0
  214. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/llm_tokens.py +0 -0
  215. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  216. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  217. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  218. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/struct_token.py +0 -0
  219. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/sy_langfuse.py +0 -0
  220. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  221. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  222. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/token_usage_es_service.py +0 -0
  223. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  224. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/token_utils.py +0 -0
  225. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/usage_token.py +0 -0
  226. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/__init__.py +0 -0
  227. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/async_sql_logger.py +0 -0
  228. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/kafka_log.py +0 -0
  229. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/log_masker.py +0 -0
  230. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/logger_levels.py +0 -0
  231. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/logger_wrapper.py +0 -0
  232. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/process_logger.py +0 -0
  233. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/sql_logger.py +0 -0
  234. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/mcp_server/__init__.py +0 -0
  235. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/mcp_server/server.py +0 -0
  236. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/__init__.py +0 -0
  237. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/cors.py +0 -0
  238. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/docs.py +0 -0
  239. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/exception.py +0 -0
  240. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/middleware.py +0 -0
  241. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/monitor_memory.py +0 -0
  242. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/mq.py +0 -0
  243. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/sandbox.py +0 -0
  244. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/timeout.py +0 -0
  245. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/token_tracking.py +0 -0
  246. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  247. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/traceid.py +0 -0
  248. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/__init__.py +0 -0
  249. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/base_http.py +0 -0
  250. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/log.py +0 -0
  251. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/mcp_server_config.py +0 -0
  252. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/mqlistener_config.py +0 -0
  253. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/mqmsg_model.py +0 -0
  254. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/mqsend_config.py +0 -0
  255. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/sandbox.py +0 -0
  256. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/sso_user.py +0 -0
  257. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/token_usage.py +0 -0
  258. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/token_usage_mysql.py +0 -0
  259. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/xxljob_handler_config.py +0 -0
  260. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/notice/__init__.py +0 -0
  261. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  262. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/notice/wecom_message.py +0 -0
  263. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  264. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  265. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  266. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  267. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  268. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  269. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  270. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  271. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  272. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/sentry/__init__.py +0 -0
  273. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/sentry/sy_sentry.py +0 -0
  274. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/services.py +0 -0
  275. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/sse/__init__.py +0 -0
  276. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/sse/event.py +0 -0
  277. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/sse/sse.py +0 -0
  278. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/__init__.py +0 -0
  279. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/example.py +0 -0
  280. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/example2.py +0 -0
  281. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/feign.py +0 -0
  282. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/feign_client.py +0 -0
  283. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_client_base.py +0 -0
  284. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  285. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  286. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_service.py +0 -0
  287. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  288. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  289. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/param.py +0 -0
  290. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/deep_agent_server.py +0 -0
  291. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_consistent_hash.py +0 -0
  292. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  293. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  294. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_deep_agent.py +0 -0
  295. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  296. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_email.py +0 -0
  297. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_encoding_cache.py +0 -0
  298. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_fix_verification.py +0 -0
  299. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_mcp_server.py +0 -0
  300. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  301. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_mq.py +0 -0
  302. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_oa_login.py +0 -0
  303. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  304. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_real_summarization.py +0 -0
  305. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_summarization_config.py +0 -0
  306. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_summarization_real.py +0 -0
  307. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  308. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/__init__.py +0 -0
  309. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/async_utils.py +0 -0
  310. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/docs.py +0 -0
  311. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/env.py +0 -0
  312. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/merge_headers.py +0 -0
  313. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/snowflake.py +0 -0
  314. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/syemail.py +0 -0
  315. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/timing.py +0 -0
  316. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/xxljob/__init__.py +0 -0
  317. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/xxljob/xxljob_service.py +0 -0
  318. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  319. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  320. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  321. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_acp_tool.py +0 -0
  322. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_asyncio_logging.py +0 -0
  323. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_config_change_notifier.py +0 -0
  324. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_hotreload_snapshot.py +0 -0
  325. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_llm_apikey_contextvar.py +0 -0
  326. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_log_masker.py +0 -0
  327. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_resilient_pg_saver.py +0 -0
  328. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_simple_chat_agent.py +0 -0
  329. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_skill_regex_upgrade.py +0 -0
  330. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_skill_write_guard.py +0 -0
  331. {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_sycli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.7a10
3
+ Version: 0.2.7a12
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -11,14 +11,14 @@ Requires-Dist: anyio==4.14.1
11
11
  Requires-Dist: decorator==5.3.1
12
12
  Requires-Dist: deepagents==0.6.12
13
13
  Requires-Dist: elasticsearch==9.4.1
14
- Requires-Dist: fastapi==0.138.1
14
+ Requires-Dist: fastapi==0.139.0
15
15
  Requires-Dist: jinja2==3.1.6
16
- Requires-Dist: kafka-python==3.0.6
16
+ Requires-Dist: kafka-python==3.0.7
17
17
  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
- Requires-Dist: langfuse==4.12.0
21
- Requires-Dist: langgraph==1.2.6
20
+ Requires-Dist: langfuse==4.13.0
21
+ Requires-Dist: langgraph==1.2.7
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
@@ -32,7 +32,7 @@ Requires-Dist: python-dotenv==1.2.2
32
32
  Requires-Dist: python-multipart==0.0.32
33
33
  Requires-Dist: pyyaml==6.0.3
34
34
  Requires-Dist: redis==7.4.0
35
- Requires-Dist: sentry-sdk[fastapi]==2.63.0
35
+ Requires-Dist: sentry-sdk[fastapi]==2.64.0
36
36
  Requires-Dist: sqlalchemy[asyncio]==2.0.51
37
37
  Requires-Dist: starlette[full]==1.3.1
38
38
  Requires-Dist: tiktoken==0.13.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.7a10"
3
+ version = "0.2.7a12"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -12,14 +12,14 @@ dependencies = [
12
12
  "decorator==5.3.1",
13
13
  "deepagents==0.6.12",
14
14
  "elasticsearch==9.4.1",
15
- "fastapi==0.138.1",
15
+ "fastapi==0.139.0",
16
16
  "jinja2==3.1.6",
17
- "kafka-python==3.0.6",
17
+ "kafka-python==3.0.7",
18
18
  "langchain==1.3.11",
19
19
  "langchain-core==1.4.8",
20
20
  "langchain-openai==1.3.3",
21
- "langfuse==4.12.0",
22
- "langgraph==1.2.6",
21
+ "langfuse==4.13.0",
22
+ "langgraph==1.2.7",
23
23
  "langgraph-checkpoint-postgres==3.1.0",
24
24
  "langgraph-checkpoint-redis==0.5.0",
25
25
  "ldap3==2.9.1",
@@ -33,7 +33,7 @@ dependencies = [
33
33
  "python-multipart==0.0.32",
34
34
  "pyyaml==6.0.3",
35
35
  "redis==7.4.0",
36
- "sentry-sdk[fastapi]==2.63.0",
36
+ "sentry-sdk[fastapi]==2.64.0",
37
37
  "sqlalchemy[asyncio]==2.0.51",
38
38
  "starlette[full]==1.3.1",
39
39
  "tiktoken==0.13.0",
@@ -1346,46 +1346,67 @@ async def _sync_skills_to_sandbox(
1346
1346
  版本比较只看沙箱 sandbox_dest/{name}/SKILL.md,无需 MinIO 锚点:
1347
1347
  - 沙箱有该技能且 version 一致 → 跳过
1348
1348
  - 沙箱没有 / 版本不一致 → 从本地 skills/ 全量上传到沙箱
1349
+
1350
+ 性能: 比对与上传均绕过 backend 的懒同步(_skip_lazy_sync=True),
1351
+ 避免「比对 read SKILL.md 前先整目录上传」「删除前先上传再删」的往返浪费。
1352
+ 多技能的 SKILL.md 比对用 gather 并发; batch_upload 服务端无条件覆盖,
1353
+ 无需先删(删除仅在版本不一致时做,用 adelete 走 /delete 而非 /execute)。
1349
1354
  """
1350
1355
  if not os.path.isdir(skills_dir):
1351
1356
  return
1352
1357
 
1353
1358
  try:
1354
- # 获取沙箱 sandbox_dest 下已有的目录列表
1355
- existing_dirs = set()
1356
- tree_result = await backend.atree(sandbox_dest, max_depth=1)
1357
- if tree_result and tree_result.tree and tree_result.tree.children:
1358
- for child in tree_result.tree.children:
1359
- if child.is_dir:
1360
- existing_dirs.add(child.name)
1361
-
1362
- skill_count = 0
1363
- skip_count = 0
1359
+ # 收集本地技能名 + 本地版本(纯本地读,快)
1360
+ local_skills = [] # [(skill_name, local_version, src_path)]
1364
1361
  for skill_name in sorted(os.listdir(skills_dir)):
1365
1362
  src = os.path.join(skills_dir, skill_name)
1366
1363
  if not os.path.isdir(src):
1367
1364
  continue
1368
-
1369
- # 读取本地版本
1370
- local_skill_md = os.path.join(src, "SKILL.md")
1371
1365
  local_version = ""
1366
+ local_skill_md = os.path.join(src, "SKILL.md")
1372
1367
  if os.path.isfile(local_skill_md):
1373
1368
  try:
1374
1369
  with open(local_skill_md, "r", encoding="utf-8") as f:
1375
1370
  local_version = _parse_skill_version(f.read())
1376
1371
  except Exception:
1377
1372
  pass
1373
+ local_skills.append((skill_name, local_version, src))
1378
1374
 
1379
- # 比较版本:只从沙箱 sandbox_dest/{name}/SKILL.md 读取
1380
- remote_version = ""
1381
- if skill_name in existing_dirs:
1382
- try:
1383
- remote_content = await backend.aread(
1384
- f"{sandbox_dest}/{skill_name}/SKILL.md")
1385
- if remote_content:
1386
- remote_version = _parse_skill_version(remote_content)
1387
- except Exception:
1388
- pass
1375
+ # 获取沙箱 sandbox_dest 下已有的目录列表(一次 atree)
1376
+ existing_dirs = set()
1377
+ tree_result = await backend.atree(sandbox_dest, max_depth=1)
1378
+ if tree_result and tree_result.tree and tree_result.tree.children:
1379
+ for child in tree_result.tree.children:
1380
+ if child.is_dir:
1381
+ existing_dirs.add(child.name)
1382
+
1383
+ # 并发读取所有已存在技能的沙箱 SKILL.md 比对版本(跳过懒同步)
1384
+ async def _read_remote_version(skill_name: str) -> str:
1385
+ if skill_name not in existing_dirs:
1386
+ return ""
1387
+ try:
1388
+ remote_content = await backend.aread(
1389
+ f"{sandbox_dest}/{skill_name}/SKILL.md",
1390
+ _skip_lazy_sync=True)
1391
+ if remote_content and remote_content.file_data:
1392
+ # FileData 是 TypedDict(dict), 用键访问而非属性
1393
+ return _parse_skill_version(
1394
+ remote_content.file_data.get("content", "") or "")
1395
+ except Exception:
1396
+ pass
1397
+ return ""
1398
+
1399
+ remote_versions = await asyncio.gather(
1400
+ *[_read_remote_version(name) for name, _, _ in local_skills]
1401
+ )
1402
+ remote_version_map = {
1403
+ name: rv for (name, _, _), rv in zip(local_skills, remote_versions)
1404
+ }
1405
+
1406
+ skill_count = 0
1407
+ skip_count = 0
1408
+ for skill_name, local_version, src in local_skills:
1409
+ remote_version = remote_version_map.get(skill_name, "")
1389
1410
 
1390
1411
  if remote_version and remote_version == local_version:
1391
1412
  SYLogger.debug(
@@ -1394,10 +1415,13 @@ async def _sync_skills_to_sandbox(
1394
1415
  skip_count += 1
1395
1416
  continue
1396
1417
 
1397
- # 版本不一致或无版本,删除旧目录后全量覆盖
1418
+ # 版本不一致或无版本,删除旧目录(走 /delete,跳过懒同步,毫秒级)
1398
1419
  if skill_name in existing_dirs:
1399
1420
  try:
1400
- await backend.aexecute(f"rm -rf {sandbox_dest}/{skill_name}")
1421
+ await backend.adelete(
1422
+ f"{sandbox_dest}/{skill_name}",
1423
+ recursive=True,
1424
+ _skip_lazy_sync=True)
1401
1425
  SYLogger.info(
1402
1426
  f"[DeepAgent] 技能版本不一致,覆盖: {skill_name} "
1403
1427
  f"({remote_version or '无版本'} → {local_version})")
@@ -1405,7 +1429,7 @@ async def _sync_skills_to_sandbox(
1405
1429
  SYLogger.warning(
1406
1430
  f"[DeepAgent] 删除旧版技能失败: {skill_name}, {e}")
1407
1431
 
1408
- # 全量上传整个技能目录到沙箱
1432
+ # 全量上传整个技能目录到沙箱(batch_upload 服务端无条件覆盖)
1409
1433
  await backend.async_sync_dirs([(src, f"{sandbox_dest}/{skill_name}")])
1410
1434
  backend._synced_skills.add(skill_name)
1411
1435
  skill_count += 1
@@ -1417,7 +1441,8 @@ async def _sync_skills_to_sandbox(
1417
1441
  # sandbox_dest 是虚拟绝对路径(/skills/system),沙箱 shell 不重映射裸绝对路径,
1418
1442
  # 须拼 $_SANDBOX_WORKSPACE 指向真实 workspace 才能命中。否则 chmod 静默失败。
1419
1443
  await backend.aexecute(
1420
- f'chmod -R 555 "$_SANDBOX_WORKSPACE{sandbox_dest}"')
1444
+ f'chmod -R 555 "$_SANDBOX_WORKSPACE{sandbox_dest}"',
1445
+ _skip_lazy_sync=True)
1421
1446
  SYLogger.info(f"[DeepAgent] 已设只读: chmod -R 555 {sandbox_dest}")
1422
1447
  except Exception as e:
1423
1448
  SYLogger.warning(f"[DeepAgent] chmod 只读失败(忽略): {e}")
@@ -333,11 +333,17 @@ class FileOperationsMixin:
333
333
  limit: int = 2000,
334
334
  *,
335
335
  timeout: int = None,
336
+ _skip_lazy_sync: bool = False,
336
337
  ) -> ReadResult:
337
- """异步读取文件内容"""
338
+ """异步读取文件内容
339
+
340
+ _skip_lazy_sync=True 时跳过懒同步(供内部技能版本比对用,
341
+ 避免 read SKILL.md 触发整目录上传)。
342
+ """
338
343
  try:
339
344
  # 按需懒同步:检测是否读取 skill 资源
340
- await self._lazy_sync_skill_from_path(file_path)
345
+ if not _skip_lazy_sync:
346
+ await self._lazy_sync_skill_from_path(file_path)
341
347
 
342
348
  await self._ensure_synced_async()
343
349
  SYLogger.info(
@@ -738,10 +744,16 @@ class FileOperationsMixin:
738
744
  recursive: bool = False,
739
745
  *,
740
746
  timeout: int = None,
747
+ _skip_lazy_sync: bool = False,
741
748
  ) -> DeleteResult:
742
- """异步删除文件或文件夹"""
749
+ """异步删除文件或文件夹
750
+
751
+ _skip_lazy_sync=True 时跳过懒同步(供内部技能覆盖删除用,
752
+ 避免「删之前先把要删的技能上传一遍」的浪费)。
753
+ """
743
754
  try:
744
- await self._lazy_sync_skill_from_path(path)
755
+ if not _skip_lazy_sync:
756
+ await self._lazy_sync_skill_from_path(path)
745
757
  await self._ensure_synced_async()
746
758
  SYLogger.info(f"[Sandbox] 异步删除: {path} (recursive={recursive})")
747
759
  result = await self._post_async_with_failover(f"{SANDBOX_API_PREFIX}/delete", {
@@ -813,17 +813,21 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
813
813
  truncated=False
814
814
  )
815
815
 
816
- async def aexecute(self, command: str, *, timeout: int = None) -> ExecuteResponse:
816
+ async def aexecute(self, command: str, *, timeout: int = None, _skip_lazy_sync: bool = False) -> ExecuteResponse:
817
817
  """异步执行 shell 命令(服务端负责路径隔离和目录初始化)
818
818
 
819
819
  如果命令引用了 /skills/<name>/ 下的资源,
820
820
  会自动按需同步该 skill 的整个目录到沙箱。
821
+
822
+ _skip_lazy_sync=True 时跳过懒同步(仅供内部技能同步/删除使用,
823
+ 避免删前先传、比对前先传的往返浪费)。
821
824
  """
822
825
  command = self._inject_env(command)
823
826
  SYLogger.info(f"[Sandbox] aexecute 开始: command={command}")
824
827
 
825
828
  # 按需懒同步:检测命令中是否引用了 skill 资源
826
- await self._lazy_sync_skill_from_path(command)
829
+ if not _skip_lazy_sync:
830
+ await self._lazy_sync_skill_from_path(command)
827
831
 
828
832
  await self._ensure_synced_async()
829
833
  SYLogger.info(f"[Sandbox] _ensure_synced_async 完成,开始执行命令: {command}")
@@ -10,7 +10,17 @@ from sycommon.middleware.context import current_llm_api_key
10
10
 
11
11
 
12
12
  def resolve_api_key(config_apikey: Optional[str]) -> str:
13
- """LLM 网关 apiKey 取值:per-user ContextVar → 配置全局 key → "-" 兜底。"""
13
+ """LLM 网关 apiKey 取值:override → per-user 派生 key → 配置全局 key → "-" 兜底。
14
+
15
+ llm_key_override 优先级最高:stream_chat 在 LLM 报错降级时 set="global" 强制
16
+ 走 nacos 全局 apiKey,或 set 成显式 key。默认 None 时走 per-user 派生 key。
17
+ """
18
+ from sycommon.middleware.context import llm_key_override
19
+ ov = llm_key_override.get()
20
+ if ov == "global":
21
+ return config_apikey or "-"
22
+ if ov: # 显式指定 key
23
+ return ov
14
24
  return current_llm_api_key.get() or config_apikey or "-"
15
25
 
16
26
 
@@ -0,0 +1,16 @@
1
+ import contextvars
2
+
3
+ current_trace_id = contextvars.ContextVar("trace_id", default=None)
4
+
5
+ current_headers = contextvars.ContextVar("headers", default=None)
6
+
7
+ # per-user LLM 网关 apiKey:agent 创建入口 set,get_llm 读取,沿 task 树传播。
8
+ # 为 None 时 get_llm 回退到 LLMConfig.apiKey 全局 key。
9
+ current_llm_api_key = contextvars.ContextVar("llm_api_key", default=None)
10
+
11
+ # LLM 网关 apiKey 降级开关(resolve_api_key 最先检查,优先级高于派生 key):
12
+ # "global" = 强制用 nacos 全局 LLMConfig.apiKey(派生 key 失败时兜底)
13
+ # 其它非空字符串 = 直接用该 key
14
+ # None = 走 per-user 派生 key(默认,正常路径)
15
+ # 沿 asyncio task 树传播,请求结束自动重置 → 每次新请求仍优先派生 key。
16
+ llm_key_override = contextvars.ContextVar("llm_key_override", default=None)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.7a10
3
+ Version: 0.2.7a12
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -11,14 +11,14 @@ Requires-Dist: anyio==4.14.1
11
11
  Requires-Dist: decorator==5.3.1
12
12
  Requires-Dist: deepagents==0.6.12
13
13
  Requires-Dist: elasticsearch==9.4.1
14
- Requires-Dist: fastapi==0.138.1
14
+ Requires-Dist: fastapi==0.139.0
15
15
  Requires-Dist: jinja2==3.1.6
16
- Requires-Dist: kafka-python==3.0.6
16
+ Requires-Dist: kafka-python==3.0.7
17
17
  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
- Requires-Dist: langfuse==4.12.0
21
- Requires-Dist: langgraph==1.2.6
20
+ Requires-Dist: langfuse==4.13.0
21
+ Requires-Dist: langgraph==1.2.7
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
@@ -32,7 +32,7 @@ Requires-Dist: python-dotenv==1.2.2
32
32
  Requires-Dist: python-multipart==0.0.32
33
33
  Requires-Dist: pyyaml==6.0.3
34
34
  Requires-Dist: redis==7.4.0
35
- Requires-Dist: sentry-sdk[fastapi]==2.63.0
35
+ Requires-Dist: sentry-sdk[fastapi]==2.64.0
36
36
  Requires-Dist: sqlalchemy[asyncio]==2.0.51
37
37
  Requires-Dist: starlette[full]==1.3.1
38
38
  Requires-Dist: tiktoken==0.13.0
@@ -324,4 +324,5 @@ tests/test_resilient_pg_saver.py
324
324
  tests/test_simple_chat_agent.py
325
325
  tests/test_skill_regex_upgrade.py
326
326
  tests/test_skill_write_guard.py
327
- tests/test_sycli.py
327
+ tests/test_sycli.py
328
+ tests/test_sync_skills_to_sandbox.py
@@ -5,14 +5,14 @@ anyio==4.14.1
5
5
  decorator==5.3.1
6
6
  deepagents==0.6.12
7
7
  elasticsearch==9.4.1
8
- fastapi==0.138.1
8
+ fastapi==0.139.0
9
9
  jinja2==3.1.6
10
- kafka-python==3.0.6
10
+ kafka-python==3.0.7
11
11
  langchain==1.3.11
12
12
  langchain-core==1.4.8
13
13
  langchain-openai==1.3.3
14
- langfuse==4.12.0
15
- langgraph==1.2.6
14
+ langfuse==4.13.0
15
+ langgraph==1.2.7
16
16
  langgraph-checkpoint-postgres==3.1.0
17
17
  langgraph-checkpoint-redis==0.5.0
18
18
  ldap3==2.9.1
@@ -26,7 +26,7 @@ python-dotenv==1.2.2
26
26
  python-multipart==0.0.32
27
27
  pyyaml==6.0.3
28
28
  redis==7.4.0
29
- sentry-sdk[fastapi]==2.63.0
29
+ sentry-sdk[fastapi]==2.64.0
30
30
  sqlalchemy[asyncio]==2.0.51
31
31
  starlette[full]==1.3.1
32
32
  tiktoken==0.13.0
@@ -0,0 +1,207 @@
1
+ """_sync_skills_to_sandbox 性能优化单测。
2
+
3
+ 验证三点:
4
+ 1. 比对/删除/上传全程不触发 backend 的懒同步(_skip_lazy_sync=True 生效)
5
+ 2. 版本不一致时用 adelete(recursive=True) 删除(替代 aexecute rm -rf)
6
+ 3. 多技能的 SKILL.md 比对是并发发出的(gather)
7
+ """
8
+ import asyncio
9
+ import os
10
+ import sys
11
+ import tempfile
12
+
13
+ import pytest
14
+
15
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
16
+
17
+ from sycommon.models.sandbox import TreeNode # noqa: E402
18
+ from sycommon.agent.sandbox.file_ops import TreeResult # noqa: E402
19
+
20
+
21
+ def _skill_md(version: str) -> str:
22
+ return f"---\nname: x\ndescription: y\nversion: {version}\n---\nbody\n"
23
+
24
+
25
+ class FakeBackend:
26
+ """记录所有调用 + 计数懒同步的假沙箱后端。
27
+
28
+ aread/adelete/aexecute 接受 _skip_lazy_sync 形参;
29
+ 若该参数为 False, 计入 lazy_sync_calls(模拟真实 backend 的懒同步副作用)。
30
+ """
31
+
32
+ def __init__(self, remote_versions: dict[str, str], remote_exists: set[str]):
33
+ # remote_versions: {skill_name: version} ("" 表示无 version 字段)
34
+ # remote_exists: {skill_name, ...} atree 返回的已存在目录
35
+ self._remote_versions = remote_versions
36
+ self._remote_exists = remote_exists
37
+ self.lazy_sync_calls = 0 # 懒同步触发次数(应始终为 0)
38
+ self.aread_calls = [] # [(path, skip_lazy)]
39
+ self.adelete_calls = [] # [(path, recursive, skip_lazy)]
40
+ self.aexecute_calls = [] # [(command, skip_lazy)]
41
+ self.sync_dirs_calls = [] # [(src, dest)]
42
+ self._synced_skills = set()
43
+ self._aread_gate = asyncio.Event()
44
+ self._aread_gate.set() # 默认不阻塞; 个别 case 主动 clear 制造串行检测
45
+
46
+ # --- tree ---
47
+ async def atree(self, path, max_depth=1):
48
+ children = [TreeNode(path=f"/skills/system/{n}", name=n, is_dir=True)
49
+ for n in self._remote_exists]
50
+ return TreeResult(tree=TreeNode(path="/skills/system", name="system",
51
+ is_dir=True, children=children))
52
+
53
+ # --- read ---
54
+ async def aread(self, file_path, offset=0, limit=2000, *, timeout=None,
55
+ _skip_lazy_sync=False):
56
+ if not _skip_lazy_sync:
57
+ self.lazy_sync_calls += 1
58
+ self.aread_calls.append((file_path, _skip_lazy_sync))
59
+ await self._aread_gate.wait() # 用于并发性断言
60
+ # 解析 /skills/system/<name>/SKILL.md
61
+ parts = file_path.split("/")
62
+ name = parts[-2] if len(parts) >= 2 else ""
63
+ ver = self._remote_versions.get(name, None)
64
+ if ver is None:
65
+ return ReadResult(error=f"File '{file_path}': not found")
66
+ content = _skill_md(ver) if ver else "---\nname: x\n---\nbody\n"
67
+ from deepagents.backends.protocol import ReadResult
68
+ # FileData 是 TypedDict(dict)
69
+ return ReadResult(file_data={"content": content, "encoding": "utf-8"})
70
+
71
+ # --- delete ---
72
+ async def adelete(self, path, recursive=False, *, timeout=None,
73
+ _skip_lazy_sync=False):
74
+ if not _skip_lazy_sync:
75
+ self.lazy_sync_calls += 1
76
+ self.adelete_calls.append((path, recursive, _skip_lazy_sync))
77
+ from sycommon.agent.sandbox.file_ops import DeleteResult
78
+ return DeleteResult(path=path)
79
+
80
+ # --- execute (chmod 用) ---
81
+ async def aexecute(self, command, *, timeout=None, _skip_lazy_sync=False):
82
+ if not _skip_lazy_sync:
83
+ self.lazy_sync_calls += 1
84
+ self.aexecute_calls.append((command, _skip_lazy_sync))
85
+ from sycommon.agent.sandbox.http_sandbox_backend import ExecuteResponse
86
+ return ExecuteResponse(output="", exit_code=0, truncated=False)
87
+
88
+ # --- 上传整目录 ---
89
+ async def async_sync_dirs(self, dirs, *, timeout=None):
90
+ for src, dest in dirs:
91
+ self.sync_dirs_calls.append((src, dest))
92
+ return {src: {"success": 1, "failed": 0, "errors": []} for src, _ in dirs}
93
+
94
+
95
+ def _make_skills_dir(specs):
96
+ """specs: [(name, version_or_None)] -> 临时目录, 每技能含 SKILL.md"""
97
+ d = tempfile.mkdtemp()
98
+ for name, ver in specs:
99
+ sd = os.path.join(d, name)
100
+ os.makedirs(sd)
101
+ md = os.path.join(sd, "SKILL.md")
102
+ with open(md, "w") as f:
103
+ f.write(_skill_md(ver) if ver else "---\nname: x\n---\nbody\n")
104
+ # 加一个脚本文件, 让 async_sync_dirs 有东西传
105
+ with open(os.path.join(sd, "script.py"), "w") as f:
106
+ f.write("# x\n")
107
+ return d
108
+
109
+
110
+ @pytest.mark.asyncio
111
+ async def test_versions_match_skips_all_upload_and_delete():
112
+ from sycommon.agent.deep_agent import _sync_skills_to_sandbox
113
+ skills = _make_skills_dir([("sy-a", "1.0.0"), ("sy-b", "2.0.0")])
114
+ backend = FakeBackend(
115
+ remote_versions={"sy-a": "1.0.0", "sy-b": "2.0.0"},
116
+ remote_exists={"sy-a", "sy-b"},
117
+ )
118
+ await _sync_skills_to_sandbox(skills, backend, sandbox_dest="/skills/system",
119
+ chmod_readonly=False)
120
+ # 版本一致: 不传文件、不删
121
+ assert backend.sync_dirs_calls == []
122
+ assert backend.adelete_calls == []
123
+ # 全程不触发懒同步
124
+ assert backend.lazy_sync_calls == 0
125
+
126
+
127
+ @pytest.mark.asyncio
128
+ async def test_version_mismatch_uses_adelete_recursive_no_lazy():
129
+ from sycommon.agent.deep_agent import _sync_skills_to_sandbox
130
+ skills = _make_skills_dir([("sy-a", "1.0.0")])
131
+ backend = FakeBackend(remote_versions={"sy-a": "0.9.0"}, # 沙箱旧版本
132
+ remote_exists={"sy-a"})
133
+ await _sync_skills_to_sandbox(skills, backend, sandbox_dest="/skills/system",
134
+ chmod_readonly=False)
135
+ # 删除走 adelete(recursive=True), 而非 aexecute rm -rf
136
+ assert len(backend.adelete_calls) == 1
137
+ path, recursive, skip = backend.adelete_calls[0]
138
+ assert path == "/skills/system/sy-a"
139
+ assert recursive is True
140
+ assert skip is True
141
+ # 没有用 aexecute 删(rm -rf), chmod 也走 _skip_lazy_sync=True
142
+ for cmd, skip in backend.aexecute_calls:
143
+ assert skip is True
144
+ assert "rm -rf" not in cmd
145
+ # 上传了一次
146
+ assert len(backend.sync_dirs_calls) == 1
147
+ # 全程不触发懒同步
148
+ assert backend.lazy_sync_calls == 0
149
+
150
+
151
+ @pytest.mark.asyncio
152
+ async def test_remote_no_version_triggers_overwrite():
153
+ """沙箱旧副本无 version 字段(remote_version=="")→ 视为不一致 → 覆盖。"""
154
+ from sycommon.agent.deep_agent import _sync_skills_to_sandbox
155
+ skills = _make_skills_dir([("sy-a", "1.0.0")])
156
+ backend = FakeBackend(remote_versions={"sy-a": ""}, # 无 version
157
+ remote_exists={"sy-a"})
158
+ await _sync_skills_to_sandbox(skills, backend, sandbox_dest="/skills/system",
159
+ chmod_readonly=False)
160
+ assert len(backend.adelete_calls) == 1 # 删旧
161
+ assert len(backend.sync_dirs_calls) == 1 # 重传
162
+ assert backend.lazy_sync_calls == 0
163
+
164
+
165
+ @pytest.mark.asyncio
166
+ async def test_remote_missing_skill_uploaded_without_delete():
167
+ """沙箱里没有该技能(不在 existing_dirs)→ 直接传, 不删。"""
168
+ from sycommon.agent.deep_agent import _sync_skills_to_sandbox
169
+ skills = _make_skills_dir([("sy-new", "1.0.0")])
170
+ backend = FakeBackend(remote_versions={}, remote_exists=set())
171
+ await _sync_skills_to_sandbox(skills, backend, sandbox_dest="/skills/system",
172
+ chmod_readonly=False)
173
+ assert backend.adelete_calls == [] # 没有旧目录可删
174
+ assert len(backend.sync_dirs_calls) == 1 # 直接传
175
+
176
+
177
+ @pytest.mark.asyncio
178
+ async def test_comparison_is_concurrent():
179
+ """多技能的 aread 比对是 gather 并发, 不是串行。
180
+
181
+ 用 gate 让每个 aread 阻塞; 串行下总耗时 ≈ N * delay, 并发下 ≈ delay。
182
+ """
183
+ from sycommon.agent.deep_agent import _sync_skills_to_sandbox
184
+ skills = _make_skills_dir([("s1", "1.0.0"), ("s2", "1.0.0"), ("s3", "1.0.0")])
185
+ backend = FakeBackend(
186
+ remote_versions={"s1": "1.0.0", "s2": "1.0.0", "s3": "1.0.0"},
187
+ remote_exists={"s1", "s2", "s3"},
188
+ )
189
+
190
+ delay = 0.15
191
+ orig_aread = backend.aread
192
+
193
+ async def slow_aread(*a, **kw):
194
+ await asyncio.sleep(delay)
195
+ return await orig_aread(*a, **kw)
196
+ backend.aread = slow_aread
197
+
198
+ loop = asyncio.get_event_loop()
199
+ t0 = loop.time()
200
+ await _sync_skills_to_sandbox(skills, backend, sandbox_dest="/skills/system",
201
+ chmod_readonly=False)
202
+ elapsed = loop.time() - t0
203
+
204
+ # 并发: 3 个 aread 应在 ~delay 内完成; 串行至少 3*delay
205
+ assert elapsed < 3 * delay, (
206
+ f"比对疑似串行: elapsed={elapsed:.2f}s, delay={delay}s (并发应<{delay*2:.2f}s)")
207
+ assert backend.lazy_sync_calls == 0
@@ -1,9 +0,0 @@
1
- import contextvars
2
-
3
- current_trace_id = contextvars.ContextVar("trace_id", default=None)
4
-
5
- current_headers = contextvars.ContextVar("headers", default=None)
6
-
7
- # per-user LLM 网关 apiKey:agent 创建入口 set,get_llm 读取,沿 task 树传播。
8
- # 为 None 时 get_llm 回退到 LLMConfig.apiKey 全局 key。
9
- current_llm_api_key = contextvars.ContextVar("llm_api_key", default=None)