sycommon-python-lib 0.2.7a7__tar.gz → 0.2.7a8__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 (328) hide show
  1. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/PKG-INFO +2 -2
  2. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/pyproject.toml +2 -2
  3. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/deep_agent.py +84 -32
  4. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/middleware/skill_api_whitelist.py +7 -9
  5. sycommon_python_lib-0.2.7a8/src/sycommon/agent/middleware/skill_write_guard.py +61 -0
  6. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/multi_agent_team.py +34 -5
  7. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/http_sandbox_backend.py +27 -27
  8. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/minio_sync.py +20 -0
  9. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/summarization_utils.py +8 -4
  10. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/kafka_log.py +121 -4
  11. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/sandbox.py +6 -3
  12. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/PKG-INFO +2 -2
  13. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/SOURCES.txt +3 -0
  14. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/requires.txt +1 -1
  15. sycommon_python_lib-0.2.7a8/tests/test_skill_regex_upgrade.py +85 -0
  16. sycommon_python_lib-0.2.7a8/tests/test_skill_write_guard.py +122 -0
  17. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/README.md +0 -0
  18. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/setup.cfg +0 -0
  19. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/__init__.py +0 -0
  20. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/cli.py +0 -0
  21. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/core/__init__.py +0 -0
  22. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/core/console.py +0 -0
  23. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/core/models.py +0 -0
  24. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/core/project.py +0 -0
  25. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/core/utils.py +0 -0
  26. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/__init__.py +0 -0
  27. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/README.md.tpl +0 -0
  28. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/__init__.py +0 -0
  29. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/api/query.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/app.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  43. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  44. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/db/service.py.tpl +0 -0
  45. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  46. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/model/parse.py.tpl +0 -0
  47. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  48. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  49. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/.env.tpl +0 -0
  50. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/.gitignore.tpl +0 -0
  51. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/Dockerfile.tpl +0 -0
  52. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/README.md.tpl +0 -0
  53. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/__init__.py +0 -0
  54. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/app.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/app.yaml.tpl +0 -0
  56. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/client/__init__.py.tpl +0 -0
  58. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/model/__init__.py.tpl +0 -0
  59. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/model/file_info.py.tpl +0 -0
  60. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/requirements.txt.tpl +0 -0
  61. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/README.md.tpl +0 -0
  62. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/__init__.py +0 -0
  63. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/app.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  67. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/README.md.tpl +0 -0
  69. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/__init__.py +0 -0
  70. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/api/__init__.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/api/echo.py.tpl +0 -0
  72. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  73. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/app.py.tpl +0 -0
  75. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/client/__init__.py.tpl +0 -0
  76. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/model/__init__.py.tpl +0 -0
  77. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  78. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/tools/mq.py.tpl +0 -0
  79. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/nexus/__init__.py +0 -0
  80. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/__init__.py +0 -0
  81. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/__main__.py +0 -0
  82. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/acp/__init__.py +0 -0
  83. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/acp/config.py +0 -0
  84. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/acp/executor.py +0 -0
  85. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/acp/registry.py +0 -0
  86. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/acp/server.py +0 -0
  87. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/agents/__init__.py +0 -0
  88. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/agents/factory.py +0 -0
  89. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/agents/prompts.py +0 -0
  90. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/__init__.py +0 -0
  91. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/browser.py +0 -0
  92. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/__init__.py +0 -0
  93. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/console.py +0 -0
  94. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/dom.py +0 -0
  95. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/network.py +0 -0
  96. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  97. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/performance.py +0 -0
  98. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  99. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/client.py +0 -0
  100. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/protocol.py +0 -0
  101. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/repl.py +0 -0
  102. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cli.py +0 -0
  103. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/__init__.py +0 -0
  104. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/acp_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/cdp_cmd.py +0 -0
  106. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/chat_cmd.py +0 -0
  107. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/create_cmd.py +0 -0
  108. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/evaluate_cmd.py +0 -0
  109. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/init_cmd.py +0 -0
  110. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/memory_cmd.py +0 -0
  111. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/resume_cmd.py +0 -0
  112. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/rollback_cmd.py +0 -0
  113. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/run_cmd.py +0 -0
  114. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/__init__.py +0 -0
  115. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/backend.py +0 -0
  116. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/config.py +0 -0
  117. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/display.py +0 -0
  118. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/git_integration.py +0 -0
  119. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/llm.py +0 -0
  120. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/state.py +0 -0
  121. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/evaluate/__init__.py +0 -0
  122. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/evaluate/api_evaluator.py +0 -0
  123. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/__init__.py +0 -0
  124. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/compressor.py +0 -0
  125. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/full.py +0 -0
  126. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/hot.py +0 -0
  127. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/manager.py +0 -0
  128. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/warm.py +0 -0
  129. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/mode/__init__.py +0 -0
  130. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/mode/create.py +0 -0
  131. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/mode/optimize.py +0 -0
  132. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/models/__init__.py +0 -0
  133. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/models/config_models.py +0 -0
  134. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/__init__.py +0 -0
  135. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/baseline_tests.py +0 -0
  136. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/checkpoint.py +0 -0
  137. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/convergence.py +0 -0
  138. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/diagnosis.py +0 -0
  139. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/engine.py +0 -0
  140. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/environment.py +0 -0
  141. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/experience.py +0 -0
  142. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/harness_prompts.py +0 -0
  143. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/history.py +0 -0
  144. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/optimization_logger.py +0 -0
  145. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/pre_validation.py +0 -0
  146. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/reward.py +0 -0
  147. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/strategy_bandit.py +0 -0
  148. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/strategy_generator.py +0 -0
  149. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/strategy_prompts.py +0 -0
  150. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/simple_chat_agent.py +0 -0
  151. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/skills/__init__.py +0 -0
  152. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/__init__.py +0 -0
  153. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/__init__.py +0 -0
  154. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/acp/__init__.py +0 -0
  155. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/acp/client.py +0 -0
  156. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/acp/fetch.py +0 -0
  157. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/acp/ssh_init.py +0 -0
  158. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/acp/tool.py +0 -0
  159. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/agent_manager.py +0 -0
  160. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/chat_events.py +0 -0
  161. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/mcp/__init__.py +0 -0
  162. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/mcp/models.py +0 -0
  163. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  164. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
  165. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
  166. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/__init__.py +0 -0
  167. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  168. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  169. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  170. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  171. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/session.py +0 -0
  172. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/__init__.py +0 -0
  173. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/ldap_service.py +0 -0
  174. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/oa_cache.py +0 -0
  175. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/oa_crypto.py +0 -0
  176. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/oa_service.py +0 -0
  177. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  178. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/ACPAgentConfig.py +0 -0
  179. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/Config.py +0 -0
  180. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/DatabaseConfig.py +0 -0
  181. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  182. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/EmbeddingConfig.py +0 -0
  183. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/LLMConfig.py +0 -0
  184. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/LangfuseConfig.py +0 -0
  185. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/MQConfig.py +0 -0
  186. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/PgConfig.py +0 -0
  187. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/RedisConfig.py +0 -0
  188. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/RerankerConfig.py +0 -0
  189. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/SentryConfig.py +0 -0
  190. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
  191. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/XxlJobConfig.py +0 -0
  192. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/__init__.py +0 -0
  193. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/config_change_notifier.py +0 -0
  194. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/async_base_db_service.py +0 -0
  195. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/async_database_service.py +0 -0
  196. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/base_db_service.py +0 -0
  197. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/database_service.py +0 -0
  198. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/elasticsearch_service.py +0 -0
  199. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  200. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/redis_service.py +0 -0
  201. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/resilient_pg_saver.py +0 -0
  202. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/token_usage_db_service.py +0 -0
  203. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/health/__init__.py +0 -0
  204. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/health/health_check.py +0 -0
  205. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/health/metrics.py +0 -0
  206. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/health/ping.py +0 -0
  207. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/heartbeat_process/__init__.py +0 -0
  208. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  209. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  210. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  211. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/__init__.py +0 -0
  212. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/embedding.py +0 -0
  213. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/get_llm.py +0 -0
  214. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/llm_logger.py +0 -0
  215. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/llm_tokens.py +0 -0
  216. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  217. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  218. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  219. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/struct_token.py +0 -0
  220. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/sy_langfuse.py +0 -0
  221. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  222. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  223. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/token_usage_es_service.py +0 -0
  224. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  225. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/token_utils.py +0 -0
  226. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/usage_token.py +0 -0
  227. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/__init__.py +0 -0
  228. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/async_sql_logger.py +0 -0
  229. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/log_masker.py +0 -0
  230. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/logger_levels.py +0 -0
  231. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/logger_wrapper.py +0 -0
  232. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/process_logger.py +0 -0
  233. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/sql_logger.py +0 -0
  234. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/mcp_server/__init__.py +0 -0
  235. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/mcp_server/server.py +0 -0
  236. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/__init__.py +0 -0
  237. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/context.py +0 -0
  238. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/cors.py +0 -0
  239. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/docs.py +0 -0
  240. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/exception.py +0 -0
  241. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/middleware.py +0 -0
  242. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/monitor_memory.py +0 -0
  243. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/mq.py +0 -0
  244. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/timeout.py +0 -0
  245. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/token_tracking.py +0 -0
  246. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  247. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/traceid.py +0 -0
  248. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/__init__.py +0 -0
  249. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/base_http.py +0 -0
  250. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/log.py +0 -0
  251. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/mcp_server_config.py +0 -0
  252. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/mqlistener_config.py +0 -0
  253. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/mqmsg_model.py +0 -0
  254. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/mqsend_config.py +0 -0
  255. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/sandbox.py +0 -0
  256. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/sso_user.py +0 -0
  257. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/token_usage.py +0 -0
  258. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/token_usage_mysql.py +0 -0
  259. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/xxljob_handler_config.py +0 -0
  260. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/notice/__init__.py +0 -0
  261. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  262. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/notice/wecom_message.py +0 -0
  263. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  264. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  265. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  266. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  267. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  268. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  269. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  270. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  271. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  272. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/sentry/__init__.py +0 -0
  273. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/sentry/sy_sentry.py +0 -0
  274. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/services.py +0 -0
  275. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/sse/__init__.py +0 -0
  276. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/sse/event.py +0 -0
  277. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/sse/sse.py +0 -0
  278. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/__init__.py +0 -0
  279. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/example.py +0 -0
  280. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/example2.py +0 -0
  281. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/feign.py +0 -0
  282. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/feign_client.py +0 -0
  283. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_client_base.py +0 -0
  284. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  285. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  286. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_service.py +0 -0
  287. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  288. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  289. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/param.py +0 -0
  290. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/deep_agent_server.py +0 -0
  291. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_consistent_hash.py +0 -0
  292. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  293. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  294. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_deep_agent.py +0 -0
  295. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  296. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_email.py +0 -0
  297. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_encoding_cache.py +0 -0
  298. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_fix_verification.py +0 -0
  299. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_mcp_server.py +0 -0
  300. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  301. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_mq.py +0 -0
  302. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_oa_login.py +0 -0
  303. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  304. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_real_summarization.py +0 -0
  305. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_summarization_config.py +0 -0
  306. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_summarization_real.py +0 -0
  307. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  308. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/__init__.py +0 -0
  309. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/async_utils.py +0 -0
  310. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/docs.py +0 -0
  311. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/env.py +0 -0
  312. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/merge_headers.py +0 -0
  313. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/snowflake.py +0 -0
  314. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/syemail.py +0 -0
  315. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/timing.py +0 -0
  316. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/xxljob/__init__.py +0 -0
  317. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/xxljob/xxljob_service.py +0 -0
  318. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  319. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  320. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  321. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_acp_tool.py +0 -0
  322. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_asyncio_logging.py +0 -0
  323. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_config_change_notifier.py +0 -0
  324. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_hotreload_snapshot.py +0 -0
  325. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_log_masker.py +0 -0
  326. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_resilient_pg_saver.py +0 -0
  327. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_simple_chat_agent.py +0 -0
  328. {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/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.7a7
3
+ Version: 0.2.7a8
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -9,7 +9,7 @@ Requires-Dist: aiohttp==3.14.1
9
9
  Requires-Dist: aiomysql==0.3.2
10
10
  Requires-Dist: anyio==4.14.1
11
11
  Requires-Dist: decorator==5.3.1
12
- Requires-Dist: deepagents==0.6.11
12
+ Requires-Dist: deepagents==0.6.12
13
13
  Requires-Dist: elasticsearch==9.4.1
14
14
  Requires-Dist: fastapi==0.138.1
15
15
  Requires-Dist: jinja2==3.1.6
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.7a7"
3
+ version = "0.2.7a8"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -10,7 +10,7 @@ dependencies = [
10
10
  "aiomysql==0.3.2",
11
11
  "anyio==4.14.1",
12
12
  "decorator==5.3.1",
13
- "deepagents==0.6.11",
13
+ "deepagents==0.6.12",
14
14
  "elasticsearch==9.4.1",
15
15
  "fastapi==0.138.1",
16
16
  "jinja2==3.1.6",
@@ -44,7 +44,7 @@ from typing import Any, AsyncGenerator, Dict, List, Optional, Tuple, TYPE_CHECKI
44
44
 
45
45
  import yaml
46
46
 
47
- from pydantic import BaseModel, Field
47
+ from pydantic import BaseModel, Field, model_validator
48
48
  from langchain_core.messages import HumanMessage, BaseMessage, AIMessageChunk, AIMessage, SystemMessage
49
49
  from langchain_core.tools import BaseTool, tool
50
50
 
@@ -57,6 +57,7 @@ from sycommon.agent.sandbox.sandbox_recovery import SandboxRecoveryManager
57
57
  from sycommon.agent.chat_events import ChatEvent, ChatEventBuilder, DEFAULT_AGENT_NAME
58
58
  from sycommon.middleware.token_tracking import TokenTrackingMiddleware
59
59
  from sycommon.middleware.tool_result_truncation import ToolResultTruncationMiddleware
60
+ from sycommon.agent.middleware.skill_write_guard import SkillWriteGuardMiddleware
60
61
  from deepagents.middleware.summarization import create_summarization_tool_middleware # noqa: F401 保留 re-export
61
62
  from sycommon.agent.summarization_utils import build_summarization_middleware
62
63
 
@@ -373,13 +374,42 @@ class AgentConfig(BaseModel):
373
374
  # 沙箱配置
374
375
  sandbox_service_name: str = "shengye-platform-sandbox"
375
376
  sandbox_timeout: int = 300
376
- skills_dir: Optional[str] = None
377
- # 技能是否已同步到沙箱:True 时跳过 _sync_skills_to_sandbox 的 atree 检查,
378
- # 但仍会基于 skills_dir 注入 /skills(即 SkillsMiddleware 照常挂载)。
379
- # 注意:不要用「把 skills_dir 置 None」来跳过同步——那会连带关闭技能注入。
377
+ # system 技能:本地仓库目录路径 → 同步到沙箱 /skills/system(只读)
378
+ system_skills_dir: Optional[str] = None
379
+ # user 技能:标记启用沙箱 /skills/user(可写,内容由 MinIO 按 user 灌入);
380
+ # 本地兜底路径仅当目录存在时用于开发期同步,生产期为 None
381
+ user_skills_dir: Optional[str] = None
382
+ # 技能是否已同步到沙箱:True 时跳过 _sync_skills_to_sandbox 的 atree 检查,
383
+ # 但 skills 注入(SkillsMiddleware)不受影响。
380
384
  skills_already_synced: bool = False
381
385
  memory_dir: Optional[str] = None
382
386
 
387
+ @property
388
+ def skills_dir(self) -> Optional[str]:
389
+ """兼容旧字段:取 system_skills_dir(迁移期防外部调用崩)。"""
390
+ return self.system_skills_dir
391
+
392
+ @model_validator(mode="before")
393
+ @classmethod
394
+ def _map_legacy_skills_dir(cls, data: Any) -> Any:
395
+ """旧 skills_dir=... 映射到 system_skills_dir 并告警(修 I3)。
396
+
397
+ pydantic v2 默认 ignore 未知字段,而 skills_dir 现在是只读 property
398
+ (非字段)——直接传 skills_dir=... 会被静默丢弃,导致 agent 无技能却无报错。
399
+ 这里在解析前拦截:若仍用旧 kwarg,映射到 system_skills_dir + DeprecationWarning。
400
+ """
401
+ if isinstance(data, dict) and "skills_dir" in data \
402
+ and "system_skills_dir" not in data:
403
+ import warnings
404
+ warnings.warn(
405
+ "AgentConfig(skills_dir=...) 已弃用,请改用 system_skills_dir="
406
+ "(system 只读)+ user_skills_dir=(user 可写)。本次按 system 处理。",
407
+ DeprecationWarning,
408
+ stacklevel=2,
409
+ )
410
+ data = {**data, "system_skills_dir": data.pop("skills_dir")}
411
+ return data
412
+
383
413
  # 工具
384
414
  tools: List[BaseTool] = Field(default_factory=list)
385
415
 
@@ -1165,17 +1195,16 @@ async def create_deep_agent(
1165
1195
  tid = thread_id or user_id
1166
1196
  agent_config = {"configurable": {"thread_id": tid}}
1167
1197
 
1168
- # 确定沙箱路径
1169
- # skills_dir: 本地目录路径 注入沙箱 /skills(SkillsMiddleware 据此挂载)
1170
- # memory_dir: 非路径字符串 标记启用沙箱 /memory/AGENTS.md
1171
- skills_path = "/skills" if config.skills_dir else None
1198
+ # 沙箱 skills 双层结构:/skills/system(只读,仓库源)+ /skills/user(可写,MinIO 按 user 灌入)
1199
+ system_path = "/skills/system" if config.system_skills_dir else None
1200
+ user_path = "/skills/user" if config.user_skills_dir else None
1172
1201
  memory_path = "/memory/AGENTS.md" if config.memory_dir else None
1173
1202
 
1174
- # 同步 skills 到沙箱(按目录名检查,已存在则跳过)
1175
- # 仅在未同步过时执行 atree 检查 + 上传;skills_already_synced=True 时跳过同步,
1176
- # skills_path 注入不受影响,确保 SkillsMiddleware 始终能挂载。
1177
- if config.skills_dir and sandbox_backend and not config.skills_already_synced:
1178
- await _sync_skills_to_sandbox(config.skills_dir, sandbox_backend)
1203
+ # 同步 system 技能到沙箱(按版本检查,已同步则跳过)+ chmod 只读保护
1204
+ # skills_already_synced=True 时跳过同步,但 system_path/user_path 注入不受影响。
1205
+ if config.system_skills_dir and sandbox_backend and not config.skills_already_synced:
1206
+ await _sync_skills_to_sandbox(config.system_skills_dir, sandbox_backend,
1207
+ sandbox_dest="/skills/system", chmod_readonly=True)
1179
1208
 
1180
1209
  # 创建 agent
1181
1210
  from deepagents import create_deep_agent as _create_deep_agent
@@ -1196,6 +1225,7 @@ async def create_deep_agent(
1196
1225
  ToolResultTruncationMiddleware(),
1197
1226
  TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
1198
1227
  summarization_mw,
1228
+ SkillWriteGuardMiddleware(), # 系统 /skills/system 只读守卫(先于白名单)
1199
1229
  ]
1200
1230
 
1201
1231
  # RubricMiddleware:复用 FilesystemMiddleware 的工具(底层走 HTTPSandboxBackend HTTP 远程调用)
@@ -1228,8 +1258,15 @@ async def create_deep_agent(
1228
1258
  "debug": config.debug,
1229
1259
  "middleware": middleware_list,
1230
1260
  }
1231
- if skills_path:
1232
- agent_kwargs["skills"] = [skills_path]
1261
+ # deepagents SkillsMiddleware 支持多 source (path, label),后 source 覆盖先 source
1262
+ # user 在后,user 同名技能优先于 system
1263
+ _sources = []
1264
+ if system_path:
1265
+ _sources.append((system_path, "系统"))
1266
+ if user_path:
1267
+ _sources.append((user_path, "用户"))
1268
+ if _sources:
1269
+ agent_kwargs["skills"] = _sources
1233
1270
  if memory_path:
1234
1271
  agent_kwargs["memory"] = [memory_path]
1235
1272
 
@@ -1299,21 +1336,24 @@ def _parse_skill_version(content: str) -> str:
1299
1336
  async def _sync_skills_to_sandbox(
1300
1337
  skills_dir: str,
1301
1338
  backend: HTTPSandboxBackend,
1339
+ *,
1340
+ sandbox_dest: str = "/skills",
1341
+ chmod_readonly: bool = False,
1302
1342
  ) -> None:
1303
- """同步技能目录到沙箱(按版本检查,版本不一致则全量覆盖)
1343
+ """同步技能目录到沙箱(按版本检查,版本不一致则全量覆盖)
1304
1344
 
1305
- 技能来源是仓库内的 skills/ 目录(随部署持久,不随 Pod 重启丢失),
1306
- 版本比较只看沙箱 /skills/{name}/SKILL.md,无需 MinIO 锚点:
1345
+ 技能来源是仓库内的 skills/ 目录(随部署持久,不随 Pod 重启丢失),
1346
+ 版本比较只看沙箱 sandbox_dest/{name}/SKILL.md,无需 MinIO 锚点:
1307
1347
  - 沙箱有该技能且 version 一致 → 跳过
1308
- - 沙箱没有 / version 不一致 → 从本地 skills/ 全量上传到沙箱
1348
+ - 沙箱没有 / 版本不一致 → 从本地 skills/ 全量上传到沙箱
1309
1349
  """
1310
1350
  if not os.path.isdir(skills_dir):
1311
1351
  return
1312
1352
 
1313
1353
  try:
1314
- # 获取沙箱 /skills 下已有的目录列表
1354
+ # 获取沙箱 sandbox_dest 下已有的目录列表
1315
1355
  existing_dirs = set()
1316
- tree_result = await backend.atree("/skills", max_depth=1)
1356
+ tree_result = await backend.atree(sandbox_dest, max_depth=1)
1317
1357
  if tree_result and tree_result.tree and tree_result.tree.children:
1318
1358
  for child in tree_result.tree.children:
1319
1359
  if child.is_dir:
@@ -1336,12 +1376,12 @@ async def _sync_skills_to_sandbox(
1336
1376
  except Exception:
1337
1377
  pass
1338
1378
 
1339
- # 比较版本:只从沙箱 /skills/{name}/SKILL.md 读取
1379
+ # 比较版本:只从沙箱 sandbox_dest/{name}/SKILL.md 读取
1340
1380
  remote_version = ""
1341
1381
  if skill_name in existing_dirs:
1342
1382
  try:
1343
1383
  remote_content = await backend.aread(
1344
- f"/skills/{skill_name}/SKILL.md")
1384
+ f"{sandbox_dest}/{skill_name}/SKILL.md")
1345
1385
  if remote_content:
1346
1386
  remote_version = _parse_skill_version(remote_content)
1347
1387
  except Exception:
@@ -1349,29 +1389,39 @@ async def _sync_skills_to_sandbox(
1349
1389
 
1350
1390
  if remote_version and remote_version == local_version:
1351
1391
  SYLogger.debug(
1352
- f"[DeepAgent] 技能版本一致,跳过: {skill_name} v{local_version}")
1392
+ f"[DeepAgent] 技能版本一致,跳过: {skill_name} v{local_version}")
1353
1393
  backend._synced_skills.add(skill_name)
1354
1394
  skip_count += 1
1355
1395
  continue
1356
1396
 
1357
- # 版本不一致或无版本,删除旧目录后全量覆盖
1397
+ # 版本不一致或无版本,删除旧目录后全量覆盖
1358
1398
  if skill_name in existing_dirs:
1359
1399
  try:
1360
- await backend.aexecute(f"rm -rf /skills/{skill_name}")
1400
+ await backend.aexecute(f"rm -rf {sandbox_dest}/{skill_name}")
1361
1401
  SYLogger.info(
1362
- f"[DeepAgent] 技能版本不一致,覆盖: {skill_name} "
1402
+ f"[DeepAgent] 技能版本不一致,覆盖: {skill_name} "
1363
1403
  f"({remote_version or '无版本'} → {local_version})")
1364
1404
  except Exception as e:
1365
1405
  SYLogger.warning(
1366
1406
  f"[DeepAgent] 删除旧版技能失败: {skill_name}, {e}")
1367
1407
 
1368
1408
  # 全量上传整个技能目录到沙箱
1369
- await backend.async_sync_dirs([(src, f"/skills/{skill_name}")])
1409
+ await backend.async_sync_dirs([(src, f"{sandbox_dest}/{skill_name}")])
1370
1410
  backend._synced_skills.add(skill_name)
1371
1411
  skill_count += 1
1372
1412
  SYLogger.info(
1373
1413
  f"[DeepAgent] 全量同步技能到沙箱: {skill_name} v{local_version}")
1374
1414
 
1415
+ if chmod_readonly:
1416
+ try:
1417
+ # sandbox_dest 是虚拟绝对路径(/skills/system),沙箱 shell 不重映射裸绝对路径,
1418
+ # 须拼 $_SANDBOX_WORKSPACE 指向真实 workspace 才能命中。否则 chmod 静默失败。
1419
+ await backend.aexecute(
1420
+ f'chmod -R 555 "$_SANDBOX_WORKSPACE{sandbox_dest}"')
1421
+ SYLogger.info(f"[DeepAgent] 已设只读: chmod -R 555 {sandbox_dest}")
1422
+ except Exception as e:
1423
+ SYLogger.warning(f"[DeepAgent] chmod 只读失败(忽略): {e}")
1424
+
1375
1425
  SYLogger.info(
1376
1426
  f"[DeepAgent] 技能同步完成: 同步 {skill_count} 个, 跳过 {skip_count} 个")
1377
1427
  except Exception as e:
@@ -1398,9 +1448,11 @@ async def _create_sandbox_backend(
1398
1448
  memory_dir.mkdir(parents=True, exist_ok=True)
1399
1449
  sync_dirs.append((str(memory_dir), "/memory"))
1400
1450
 
1401
- # 确定 skills_dir,传递给沙箱后端用于懒同步
1402
- if config.skills_dir:
1403
- skills_dir_for_backend = str(Path(config.skills_dir))
1451
+ # 确定 skills_dir,传递给沙箱后端用于懒同步。
1452
+ # 懒同步按 os.path.join(_skills_dir, scope, skill_name) 解析本地源(system/user/<域>),
1453
+ # _skills_dir 须是 system/ 与 user/ 的【父目录】(<repo>/skills),而非 system_skills_dir 本身。
1454
+ if config.system_skills_dir:
1455
+ skills_dir_for_backend = str(Path(config.system_skills_dir).parent)
1404
1456
  else:
1405
1457
  skills_dir_for_backend = str(project_root / "skills")
1406
1458
 
@@ -30,15 +30,13 @@ from langgraph.prebuilt.tool_node import ToolCallRequest
30
30
 
31
31
  from sycommon.logging.kafka_log import SYLogger
32
32
 
33
- # 命令路径形如 skills/sy-oa-skill/workflow-todo/scripts/x.py
34
- # skills/sy-syt-skill/shengye-platform-zhongdeng/SKILL.md
35
- # skills/sy-syt-skill/generate-plan/... (有/无 scripts/ 都识别)
36
- # 取「skills/<顶级技能>/」的【第一段】作顶级技能名(如 sy-oa-skill),
37
- # 配合 SkillApiWhitelist 按顶级技能(5 个域)配置——每个域的 allowlist 是其下
38
- # 所有子技能出网地址的并集。用 (?:/|$) 锚定段尾,避免误吞后续路径段。
39
- # (?<![\w]) 否定左查找:要求 skills 前不是单词字符,避免误匹配 myskills/、
40
- # theskills/ 等含 skills 子串的路径(行首、空格、引号、/ 后均成立)。
41
- _SKILL_TOP_RE = re.compile(r'(?<![\w])skills/([A-Za-z0-9_\-]+)(?:/|$)')
33
+ # 命令路径形如 skills/system/sy-oa-skill/workflow-todo/scripts/x.py
34
+ # skills/user/sy-oa-skill/SKILL.md
35
+ # 拆为 system/user 双层后,顶层段是 system|user,需跳过它取【第二段】作域级技能名
36
+ # (如 sy-oa-skill),配合 SkillApiWhitelist 按顶级域配置。
37
+ # (?<![\w]) 否定左查找:要求 skills 前不是单词字符,避免误匹配 myskills/。
38
+ _SKILL_TOP_RE = re.compile(
39
+ r'(?<![\w])skills/(?:system|user)/([A-Za-z0-9_\-]+)(?:/|$)')
42
40
 
43
41
  # BASE_URL 占位符 ${VAR}
44
42
  _PLACEHOLDER_RE = re.compile(r'\$\{([A-Z_][A-Z0-9_]*)\}')
@@ -0,0 +1,61 @@
1
+ """系统技能只读守卫中间件。
2
+
3
+ 拦 write_file / edit_file / execute 三类写操作对 /skills/system 的命中,
4
+ 返回 error ToolMessage(不调 handler,短路)。/skills/user 不拦。
5
+
6
+ 双层防护之一(另一层是沙箱 chmod -R 555 /skills/system):
7
+ 本中间件负责给 agent 清晰错误反馈并 fail-closed,chmod 负责兜底防 shell 绕过。
8
+ """
9
+ import re
10
+ from langchain.agents.middleware.types import AgentMiddleware
11
+ from langchain_core.messages import ToolMessage
12
+ from langgraph.prebuilt.tool_node import ToolCallRequest
13
+
14
+ # /skills/system 或 /skills/system/... (行尾/引号/空白/斜杠均可作边界,防匹配 /skills/systembackup)
15
+ _PROTECTED_PATH_RE = re.compile(r'/skills/system(?:/|\s|"|\'|$)')
16
+
17
+ # 写动作动词(命令首或分号/管道/空格后)
18
+ _WRITE_VERB_RE = re.compile(
19
+ r'(^|[\s;&|])(rm|rmdir|mv|cp|chmod|chown|tee|truncate|install|rsync|scp|dd)\b')
20
+ # 输出重定向 > 或 >>
21
+ _REDIRECT_RE = re.compile(r'>>?')
22
+
23
+ _WRITE_TOOLS = {"write_file", "edit_file"}
24
+ _DENIED_MSG = ("Error: 系统技能 /skills/system 为只读,禁止修改/删除。"
25
+ "如需定制,请复制到用户技能 /skills/user/ 后编辑。")
26
+
27
+
28
+ def _is_protected_path(p: str) -> bool:
29
+ s = (p or "").strip().replace("\\", "/")
30
+ return s == "/skills/system" or s.startswith("/skills/system/")
31
+
32
+
33
+ def _command_writes_system(cmd: str) -> bool:
34
+ if not _PROTECTED_PATH_RE.search(cmd or ""):
35
+ return False
36
+ return bool(_WRITE_VERB_RE.search(cmd) or _REDIRECT_RE.search(cmd))
37
+
38
+
39
+ class SkillWriteGuardMiddleware(AgentMiddleware):
40
+ """拦对 /skills/system 的写。仅实现 awrap_tool_call(异步链路)。"""
41
+
42
+ async def awrap_tool_call(self, request: ToolCallRequest, handler):
43
+ tc = request.tool_call
44
+ name = tc.get("name")
45
+ args = tc.get("args", {}) or {}
46
+
47
+ if name in _WRITE_TOOLS:
48
+ fp = args.get("file_path") if isinstance(args, dict) else ""
49
+ if _is_protected_path(fp):
50
+ return ToolMessage(content=_DENIED_MSG, name=name,
51
+ tool_call_id=tc.get("id", ""), status="error")
52
+ return await handler(request)
53
+
54
+ if name == "execute":
55
+ command = args.get("command", "") if isinstance(args, dict) else ""
56
+ if _command_writes_system(command):
57
+ return ToolMessage(content=_DENIED_MSG, name="execute",
58
+ tool_call_id=tc.get("id", ""), status="error")
59
+ return await handler(request)
60
+
61
+ return await handler(request)
@@ -45,6 +45,7 @@ from sycommon.agent.sandbox.sandbox_recovery import SandboxRecoveryManager
45
45
  from sycommon.agent.chat_events import ChatEvent, ChatEventBuilder, DEFAULT_AGENT_NAME
46
46
  from sycommon.middleware.token_tracking import TokenTrackingMiddleware
47
47
  from sycommon.middleware.tool_result_truncation import ToolResultTruncationMiddleware
48
+ from sycommon.agent.middleware.skill_write_guard import SkillWriteGuardMiddleware
48
49
  from deepagents.middleware.summarization import create_summarization_tool_middleware # noqa: F401 保留 re-export
49
50
  from sycommon.agent.summarization_utils import build_summarization_middleware
50
51
 
@@ -131,9 +132,19 @@ class TeamConfig(BaseModel):
131
132
 
132
133
  sandbox_service_name: str = "shengye-platform-sandbox"
133
134
  sandbox_timeout: int = 300
134
- skills_dir: Optional[str] = None
135
+ # system 技能:本地仓库目录 → 同步到沙箱 /skills/system(只读)
136
+ system_skills_dir: Optional[str] = None
137
+ # user 技能:标记启用沙箱 /skills/user(可写,内容由 MinIO 灌入)
138
+ user_skills_dir: Optional[str] = None
139
+ # 技能是否已同步到沙箱:True 时跳过 _sync_skills_to_sandbox
140
+ skills_already_synced: bool = False
135
141
  memory_dir: Optional[str] = None
136
142
 
143
+ @property
144
+ def skills_dir(self) -> Optional[str]:
145
+ """兼容旧字段:取 system_skills_dir。"""
146
+ return self.system_skills_dir
147
+
137
148
  shared_tools: List[BaseTool] = Field(default_factory=list)
138
149
 
139
150
  debug: bool = False
@@ -578,6 +589,21 @@ async def create_multi_agent_team(
578
589
  tid = thread_id or user_id
579
590
  agent_config = {"configurable": {"thread_id": tid}}
580
591
 
592
+ # 同步 system 技能到沙箱(按版本检查)+ chmod 只读保护(与单 Agent 路径对齐)
593
+ if config.system_skills_dir and sandbox_backend and not config.skills_already_synced:
594
+ from sycommon.agent.deep_agent import _sync_skills_to_sandbox
595
+ await _sync_skills_to_sandbox(config.system_skills_dir, sandbox_backend,
596
+ sandbox_dest="/skills/system", chmod_readonly=True)
597
+
598
+ # 沙箱 skills 双层路径(用于 SkillsMiddleware 双 source)
599
+ system_path = "/skills/system" if config.system_skills_dir else None
600
+ user_path = "/skills/user" if config.user_skills_dir else None
601
+ skill_sources = []
602
+ if system_path:
603
+ skill_sources.append((system_path, "系统"))
604
+ if user_path:
605
+ skill_sources.append((user_path, "用户")) # user 在后 → 同名优先
606
+
581
607
  # 创建子 agents(递归支持嵌套团队)
582
608
  from deepagents import create_deep_agent
583
609
  from deepagents.middleware.subagents import CompiledSubAgent
@@ -587,6 +613,7 @@ async def create_multi_agent_team(
587
613
  ToolResultTruncationMiddleware(),
588
614
  TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
589
615
  summarization_mw,
616
+ SkillWriteGuardMiddleware(),
590
617
  ]
591
618
  shared = config.shared_tools or [get_current_date]
592
619
 
@@ -632,7 +659,7 @@ async def create_multi_agent_team(
632
659
  model=model,
633
660
  tools=config.shared_tools or [get_current_date],
634
661
  backend=sandbox_backend,
635
- skills=["/skills"],
662
+ skills=skill_sources or None,
636
663
  memory=["/memory/AGENTS.md"],
637
664
  checkpointer=checkpointer,
638
665
  system_prompt=config.coordinator_prompt,
@@ -643,6 +670,7 @@ async def create_multi_agent_team(
643
670
  ToolResultTruncationMiddleware(),
644
671
  TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
645
672
  coord_summarization_mw,
673
+ SkillWriteGuardMiddleware(),
646
674
  ],
647
675
  )
648
676
 
@@ -679,9 +707,10 @@ async def _create_sandbox_backend_for_team(
679
707
  memory_dir.mkdir(parents=True, exist_ok=True)
680
708
  sync_dirs.append((str(memory_dir), "/memory"))
681
709
 
682
- # 确定 skills_dir,传递给沙箱后端用于懒同步
683
- if config.skills_dir:
684
- skills_dir_for_backend = str(Path(config.skills_dir))
710
+ # 懒同步按 os.path.join(_skills_dir, scope, skill_name) 解析本地源(system/<域>),
711
+ # 故 _skills_dir 须是 system/ 与 user/ 的【父目录】。
712
+ if config.system_skills_dir:
713
+ skills_dir_for_backend = str(Path(config.system_skills_dir).parent)
685
714
  else:
686
715
  skills_dir_for_backend = str(project_root / "skills")
687
716
 
@@ -9,6 +9,7 @@ HTTP 客户端沙箱后端
9
9
  import asyncio
10
10
  import base64
11
11
  import os
12
+ import re
12
13
  import ssl
13
14
  import sys
14
15
  import tempfile
@@ -36,6 +37,12 @@ try:
36
37
  except ImportError:
37
38
  _SSL_CONTEXT = ssl.create_default_context()
38
39
 
40
+ # 技能访问路径解析:/skills/(system|user)/<域>/...
41
+ # 前导斜杠可选(命令里可能是 cd skills/system/x),(?<![\w]) 防误匹配 myskills/
42
+ _SKILL_PATH_RE = re.compile(
43
+ r'(?:^|[\s/\'"])skills/(system|user)/([a-zA-Z0-9_\-]+)/'
44
+ )
45
+
39
46
 
40
47
  def _read_file_safe(path: str) -> bytes:
41
48
  with open(path, "rb") as f:
@@ -851,33 +858,29 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
851
858
  if not self._skills_dir:
852
859
  return
853
860
 
854
- import re
855
- # 匹配 /skills/<skill_name>/ 或 skills/<skill_name>/
856
- match = re.search(r'/skills/([a-zA-Z0-9_\-]+)/', path)
857
- if not match:
858
- match = re.search(r'(?:^|\s|")skills/([a-zA-Z0-9_\-]+)/', path)
861
+ match = _SKILL_PATH_RE.search(path)
859
862
  if not match:
860
863
  return
861
-
862
- skill_name = match.group(1)
863
- if skill_name in self._synced_skills:
864
+ scope, skill_name = match.group(1), match.group(2)
865
+ cache_key = f"{scope}/{skill_name}"
866
+ if cache_key in self._synced_skills:
864
867
  return
865
868
 
866
- skill_dir = os.path.join(self._skills_dir, skill_name)
869
+ skill_dir = os.path.join(self._skills_dir, scope, skill_name)
867
870
  if not os.path.isdir(skill_dir):
868
- self._synced_skills.add(skill_name)
871
+ self._synced_skills.add(cache_key)
869
872
  return
870
873
 
871
874
  try:
872
875
  await self.async_sync_dirs([
873
- (skill_dir, f"/skills/{skill_name}")
876
+ (skill_dir, f"/skills/{scope}/{skill_name}")
874
877
  ])
875
- self._synced_skills.add(skill_name)
878
+ self._synced_skills.add(cache_key)
876
879
  SYLogger.info(
877
- f"[Sandbox] 懒同步技能目录: {skill_name}/")
880
+ f"[Sandbox] 懒同步技能目录: {cache_key}/")
878
881
  except Exception as e:
879
882
  SYLogger.warning(
880
- f"[Sandbox] 懒同步技能目录失败: {skill_name}, {e}")
883
+ f"[Sandbox] 懒同步技能目录失败: {cache_key}, {e}")
881
884
 
882
885
  def _lazy_sync_skill_from_path_sync(self, path: str) -> None:
883
886
  """同步版本的懒同步(在同步文件操作中调用)
@@ -887,32 +890,29 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
887
890
  if not self._skills_dir:
888
891
  return
889
892
 
890
- import re
891
- match = re.search(r'/skills/([a-zA-Z0-9_\-]+)/', path)
892
- if not match:
893
- match = re.search(r'(?:^|\s|")skills/([a-zA-Z0-9_\-]+)/', path)
893
+ match = _SKILL_PATH_RE.search(path)
894
894
  if not match:
895
895
  return
896
-
897
- skill_name = match.group(1)
898
- if skill_name in self._synced_skills:
896
+ scope, skill_name = match.group(1), match.group(2)
897
+ cache_key = f"{scope}/{skill_name}"
898
+ if cache_key in self._synced_skills:
899
899
  return
900
900
 
901
- skill_dir = os.path.join(self._skills_dir, skill_name)
901
+ skill_dir = os.path.join(self._skills_dir, scope, skill_name)
902
902
  if not os.path.isdir(skill_dir):
903
- self._synced_skills.add(skill_name)
903
+ self._synced_skills.add(cache_key)
904
904
  return
905
905
 
906
906
  try:
907
907
  # 同步版本直接调用同步上传方法
908
908
  self._upload_directory_sync(
909
- skill_dir, f"/skills/{skill_name}", mode="full")
910
- self._synced_skills.add(skill_name)
909
+ skill_dir, f"/skills/{scope}/{skill_name}", mode="full")
910
+ self._synced_skills.add(cache_key)
911
911
  SYLogger.info(
912
- f"[Sandbox] 懒同步技能目录(sync): {skill_name}/")
912
+ f"[Sandbox] 懒同步技能目录(sync): {cache_key}/")
913
913
  except Exception as e:
914
914
  SYLogger.warning(
915
- f"[Sandbox] 懒同步技能目录失败(sync): {skill_name}, {e}")
915
+ f"[Sandbox] 懒同步技能目录失败(sync): {cache_key}, {e}")
916
916
 
917
917
  async def _sync_async(self, *, timeout: int = None) -> dict:
918
918
  """同步目录(异步版本)
@@ -326,6 +326,20 @@ class MinioSyncService(metaclass=SingletonMeta):
326
326
  else:
327
327
  files.append(path)
328
328
 
329
+ def _exclude_system_skills(self, files: list[str]) -> list[str]:
330
+ """过滤掉 /skills/system/ 前缀文件——system 是只读仓库产物,不进 MinIO。
331
+
332
+ 路径形如 skills/system/sy-oa-skill/...(collect_sandbox_files 已 strip 根 user_id
333
+ 前缀,根盘符 / 由调用方拼接)。兼容带不带前导斜杠。
334
+ """
335
+ out = []
336
+ for fp in files:
337
+ norm = fp.replace("\\", "/").lstrip("/")
338
+ if norm == "skills/system" or norm.startswith("skills/system/"):
339
+ continue
340
+ out.append(fp)
341
+ return out
342
+
329
343
  async def sync_sandbox_to_minio(self, sandbox_backend, user_id: str) -> int:
330
344
  """扫描沙箱目录,增量同步文件到 MinIO
331
345
 
@@ -357,6 +371,7 @@ class MinioSyncService(metaclass=SingletonMeta):
357
371
  return 0
358
372
 
359
373
  sandbox_files = self.collect_sandbox_files(tree_result)
374
+ sandbox_files = self._exclude_system_skills(sandbox_files)
360
375
  if not sandbox_files:
361
376
  # 沙箱为空,清理 MinIO 中该用户的所有文件
362
377
  try:
@@ -523,6 +538,11 @@ class MinioSyncService(metaclass=SingletonMeta):
523
538
  if rel_path and rel_path not in existing_files:
524
539
  to_restore.append(rel_path)
525
540
 
541
+ # 排除 /skills/system —— system 是只读仓库产物,由本地仓库注入,
542
+ # 绝不从 MinIO 恢复(否则旧的/遗留 system 副本会落回用户沙箱,污染只读区)。
543
+ # 与 sync_sandbox_to_minio 的排除对称,守住「system 不进 MinIO」不变式。
544
+ to_restore = self._exclude_system_skills(to_restore)
545
+
526
546
  if not to_restore:
527
547
  SYLogger.info(f"[MinIO] 沙箱文件完整,无需恢复: user={user_id}")
528
548
  return 0
@@ -206,10 +206,9 @@ async def _patched_awrap_model_call(self, request, handler):
206
206
  real_tokens = _extract_last_usage_total_tokens(effective_messages)
207
207
 
208
208
  # 估算值(用于日志对比)
209
- try:
210
- estimated = _approx_counter(counted_messages, tools=request.tools)
211
- except TypeError:
212
- estimated = _approx_counter(counted_messages)
209
+ # langchain-core>=1.4.8 的 count_tokens_approximately 原生支持 tools=,
210
+ # 不再需要 try/except TypeError 兜底。
211
+ estimated = _approx_counter(counted_messages, tools=request.tools)
213
212
 
214
213
  # 如果有真实 token,临时替换 token_counter 使 _orig 内部判断也用真实值
215
214
  # 这样 _should_summarize 和 _determine_cutoff_index 都能拿到正确的 token 数
@@ -301,6 +300,11 @@ except ImportError:
301
300
  # 虽然不能改变 __init__ 的默认参数(Python 在定义时求值),
302
301
  # 但可以防止任何运行时读取 DEFAULT_SUMMARY_PROMPT 的代码拿到英文版。
303
302
  _summ_mod.DEFAULT_SUMMARY_PROMPT = CUSTOM_SUMMARY_PROMPT
303
+ # deepagents 0.6.12 起 SummarizationMiddleware 的默认 prompt 改读
304
+ # DEEPAGENTS_DEFAULT_SUMMARY_PROMPT(在模块加载时由 DEFAULT_SUMMARY_PROMPT 派生),
305
+ # 因此只替换 DEFAULT_SUMMARY_PROMPT 已无法阻断新链路,需同步覆盖派生常量。
306
+ if hasattr(_summ_mod, "DEEPAGENTS_DEFAULT_SUMMARY_PROMPT"):
307
+ _summ_mod.DEEPAGENTS_DEFAULT_SUMMARY_PROMPT = CUSTOM_SUMMARY_PROMPT
304
308
  try:
305
309
  import langchain.agents.middleware.summarization as _lc_summ_mod
306
310
  _lc_summ_mod.DEFAULT_SUMMARY_PROMPT = CUSTOM_SUMMARY_PROMPT