sycommon-python-lib 0.2.7a12__tar.gz → 0.2.7a14__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 (332) hide show
  1. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/deep_agent.py +45 -5
  4. sycommon_python_lib-0.2.7a14/src/sycommon/agent/middleware/sensitive_guard.py +429 -0
  5. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/multi_agent_team.py +32 -0
  6. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/context.py +5 -0
  7. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  8. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon_python_lib.egg-info/SOURCES.txt +2 -0
  9. sycommon_python_lib-0.2.7a14/tests/test_sensitive_guard.py +229 -0
  10. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/README.md +0 -0
  11. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/setup.cfg +0 -0
  12. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/__init__.py +0 -0
  13. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/cli.py +0 -0
  14. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/core/__init__.py +0 -0
  15. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/core/console.py +0 -0
  16. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/core/models.py +0 -0
  17. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/core/project.py +0 -0
  18. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/core/utils.py +0 -0
  19. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/__init__.py +0 -0
  20. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/README.md.tpl +0 -0
  21. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/__init__.py +0 -0
  22. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  23. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  24. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  25. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/api/query.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/app.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/db/service.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/model/parse.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/.env.tpl +0 -0
  43. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/.gitignore.tpl +0 -0
  44. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/Dockerfile.tpl +0 -0
  45. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/README.md.tpl +0 -0
  46. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/__init__.py +0 -0
  47. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/app.py.tpl +0 -0
  48. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/app.yaml.tpl +0 -0
  49. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/client/__init__.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/model/__init__.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/model/file_info.py.tpl +0 -0
  53. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/base/requirements.txt.tpl +0 -0
  54. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/cli/README.md.tpl +0 -0
  55. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/cli/__init__.py +0 -0
  56. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/cli/app.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  58. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  59. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  60. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  61. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/README.md.tpl +0 -0
  62. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/__init__.py +0 -0
  63. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/api/__init__.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/api/echo.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/app.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/client/__init__.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/model/__init__.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/command/templates/web/tools/mq.py.tpl +0 -0
  72. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/nexus/__init__.py +0 -0
  73. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/__init__.py +0 -0
  74. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/__main__.py +0 -0
  75. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/acp/__init__.py +0 -0
  76. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/acp/config.py +0 -0
  77. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/acp/executor.py +0 -0
  78. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/acp/registry.py +0 -0
  79. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/acp/server.py +0 -0
  80. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/agents/__init__.py +0 -0
  81. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/agents/factory.py +0 -0
  82. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/agents/prompts.py +0 -0
  83. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/__init__.py +0 -0
  84. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/browser.py +0 -0
  85. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/capabilities/__init__.py +0 -0
  86. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/capabilities/console.py +0 -0
  87. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/capabilities/dom.py +0 -0
  88. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/capabilities/network.py +0 -0
  89. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  90. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/capabilities/performance.py +0 -0
  91. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  92. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/client.py +0 -0
  93. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/protocol.py +0 -0
  94. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cdp/repl.py +0 -0
  95. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/cli.py +0 -0
  96. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/__init__.py +0 -0
  97. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/acp_cmd.py +0 -0
  98. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/cdp_cmd.py +0 -0
  99. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/chat_cmd.py +0 -0
  100. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/create_cmd.py +0 -0
  101. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/evaluate_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/init_cmd.py +0 -0
  103. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/memory_cmd.py +0 -0
  104. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/resume_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/rollback_cmd.py +0 -0
  106. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/commands/run_cmd.py +0 -0
  107. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/core/__init__.py +0 -0
  108. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/core/backend.py +0 -0
  109. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/core/config.py +0 -0
  110. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/core/display.py +0 -0
  111. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/core/git_integration.py +0 -0
  112. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/core/llm.py +0 -0
  113. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/core/state.py +0 -0
  114. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/evaluate/__init__.py +0 -0
  115. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/evaluate/api_evaluator.py +0 -0
  116. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/memory/__init__.py +0 -0
  117. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/memory/compressor.py +0 -0
  118. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/memory/full.py +0 -0
  119. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/memory/hot.py +0 -0
  120. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/memory/manager.py +0 -0
  121. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/memory/warm.py +0 -0
  122. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/mode/__init__.py +0 -0
  123. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/mode/create.py +0 -0
  124. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/mode/optimize.py +0 -0
  125. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/models/__init__.py +0 -0
  126. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/models/config_models.py +0 -0
  127. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/__init__.py +0 -0
  128. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/baseline_tests.py +0 -0
  129. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/checkpoint.py +0 -0
  130. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/convergence.py +0 -0
  131. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/diagnosis.py +0 -0
  132. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/engine.py +0 -0
  133. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/environment.py +0 -0
  134. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/experience.py +0 -0
  135. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/harness_prompts.py +0 -0
  136. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/history.py +0 -0
  137. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/optimization_logger.py +0 -0
  138. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/pre_validation.py +0 -0
  139. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/reward.py +0 -0
  140. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/strategy_bandit.py +0 -0
  141. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/strategy_generator.py +0 -0
  142. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/rl/strategy_prompts.py +0 -0
  143. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/simple_chat_agent.py +0 -0
  144. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycli/skills/__init__.py +0 -0
  145. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/__init__.py +0 -0
  146. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/__init__.py +0 -0
  147. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/acp/__init__.py +0 -0
  148. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/acp/client.py +0 -0
  149. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/acp/fetch.py +0 -0
  150. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/acp/ssh_init.py +0 -0
  151. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/acp/tool.py +0 -0
  152. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/agent_manager.py +0 -0
  153. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/chat_events.py +0 -0
  154. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/mcp/__init__.py +0 -0
  155. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/mcp/models.py +0 -0
  156. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  157. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
  158. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
  159. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
  160. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  161. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/sandbox/__init__.py +0 -0
  162. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  163. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  164. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  165. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  166. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  167. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  168. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/sandbox/session.py +0 -0
  169. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/agent/summarization_utils.py +0 -0
  170. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/auth/__init__.py +0 -0
  171. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/auth/ldap_service.py +0 -0
  172. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/auth/oa_cache.py +0 -0
  173. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/auth/oa_crypto.py +0 -0
  174. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/auth/oa_service.py +0 -0
  175. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  176. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/ACPAgentConfig.py +0 -0
  177. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/Config.py +0 -0
  178. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/DatabaseConfig.py +0 -0
  179. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  180. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/EmbeddingConfig.py +0 -0
  181. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/LLMConfig.py +0 -0
  182. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/LangfuseConfig.py +0 -0
  183. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/MQConfig.py +0 -0
  184. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/PgConfig.py +0 -0
  185. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/RedisConfig.py +0 -0
  186. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/RerankerConfig.py +0 -0
  187. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/SentryConfig.py +0 -0
  188. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
  189. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/XxlJobConfig.py +0 -0
  190. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/__init__.py +0 -0
  191. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/config/config_change_notifier.py +0 -0
  192. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/database/async_base_db_service.py +0 -0
  193. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/database/async_database_service.py +0 -0
  194. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/database/base_db_service.py +0 -0
  195. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/database/database_service.py +0 -0
  196. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/database/elasticsearch_service.py +0 -0
  197. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  198. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/database/redis_service.py +0 -0
  199. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/database/resilient_pg_saver.py +0 -0
  200. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/database/token_usage_db_service.py +0 -0
  201. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/health/__init__.py +0 -0
  202. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/health/health_check.py +0 -0
  203. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/health/metrics.py +0 -0
  204. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/health/ping.py +0 -0
  205. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/heartbeat_process/__init__.py +0 -0
  206. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  207. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  208. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  209. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/__init__.py +0 -0
  210. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/embedding.py +0 -0
  211. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/get_llm.py +0 -0
  212. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/llm_logger.py +0 -0
  213. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/llm_tokens.py +0 -0
  214. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  215. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  216. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  217. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/struct_token.py +0 -0
  218. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/sy_langfuse.py +0 -0
  219. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  220. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  221. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/token_usage_es_service.py +0 -0
  222. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  223. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/token_utils.py +0 -0
  224. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/llm/usage_token.py +0 -0
  225. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/logging/__init__.py +0 -0
  226. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/logging/async_sql_logger.py +0 -0
  227. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/logging/kafka_log.py +0 -0
  228. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/logging/log_masker.py +0 -0
  229. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/logging/logger_levels.py +0 -0
  230. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/logging/logger_wrapper.py +0 -0
  231. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/logging/process_logger.py +0 -0
  232. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/logging/sql_logger.py +0 -0
  233. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/mcp_server/__init__.py +0 -0
  234. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/mcp_server/server.py +0 -0
  235. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/__init__.py +0 -0
  236. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/cors.py +0 -0
  237. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/docs.py +0 -0
  238. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/exception.py +0 -0
  239. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/middleware.py +0 -0
  240. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/monitor_memory.py +0 -0
  241. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/mq.py +0 -0
  242. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/sandbox.py +0 -0
  243. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/timeout.py +0 -0
  244. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/token_tracking.py +0 -0
  245. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  246. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/middleware/traceid.py +0 -0
  247. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/__init__.py +0 -0
  248. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/base_http.py +0 -0
  249. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/log.py +0 -0
  250. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/mcp_server_config.py +0 -0
  251. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/mqlistener_config.py +0 -0
  252. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/mqmsg_model.py +0 -0
  253. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/mqsend_config.py +0 -0
  254. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/sandbox.py +0 -0
  255. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/sso_user.py +0 -0
  256. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/token_usage.py +0 -0
  257. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/token_usage_mysql.py +0 -0
  258. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/models/xxljob_handler_config.py +0 -0
  259. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/notice/__init__.py +0 -0
  260. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  261. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/notice/wecom_message.py +0 -0
  262. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  263. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  264. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  265. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  266. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  267. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  268. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  269. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  270. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  271. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/sentry/__init__.py +0 -0
  272. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/sentry/sy_sentry.py +0 -0
  273. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/services.py +0 -0
  274. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/sse/__init__.py +0 -0
  275. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/sse/event.py +0 -0
  276. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/sse/sse.py +0 -0
  277. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/__init__.py +0 -0
  278. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/example.py +0 -0
  279. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/example2.py +0 -0
  280. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/feign.py +0 -0
  281. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/feign_client.py +0 -0
  282. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/nacos_client_base.py +0 -0
  283. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  284. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  285. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/nacos_service.py +0 -0
  286. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  287. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  288. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/synacos/param.py +0 -0
  289. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/deep_agent_server.py +0 -0
  290. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_consistent_hash.py +0 -0
  291. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  292. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  293. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_deep_agent.py +0 -0
  294. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  295. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_email.py +0 -0
  296. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_encoding_cache.py +0 -0
  297. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_fix_verification.py +0 -0
  298. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_mcp_server.py +0 -0
  299. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  300. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_mq.py +0 -0
  301. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_oa_login.py +0 -0
  302. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  303. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_real_summarization.py +0 -0
  304. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_summarization_config.py +0 -0
  305. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_summarization_real.py +0 -0
  306. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  307. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tools/__init__.py +0 -0
  308. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tools/async_utils.py +0 -0
  309. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tools/docs.py +0 -0
  310. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tools/env.py +0 -0
  311. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tools/merge_headers.py +0 -0
  312. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tools/snowflake.py +0 -0
  313. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tools/syemail.py +0 -0
  314. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/tools/timing.py +0 -0
  315. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/xxljob/__init__.py +0 -0
  316. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon/xxljob/xxljob_service.py +0 -0
  317. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  318. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  319. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  320. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  321. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_acp_tool.py +0 -0
  322. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_asyncio_logging.py +0 -0
  323. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_config_change_notifier.py +0 -0
  324. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_hotreload_snapshot.py +0 -0
  325. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_llm_apikey_contextvar.py +0 -0
  326. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_log_masker.py +0 -0
  327. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_resilient_pg_saver.py +0 -0
  328. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_simple_chat_agent.py +0 -0
  329. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_skill_regex_upgrade.py +0 -0
  330. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_skill_write_guard.py +0 -0
  331. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_sycli.py +0 -0
  332. {sycommon_python_lib-0.2.7a12 → sycommon_python_lib-0.2.7a14}/tests/test_sync_skills_to_sandbox.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.7a12
3
+ Version: 0.2.7a14
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.7a12"
3
+ version = "0.2.7a14"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -58,6 +58,7 @@ from sycommon.agent.chat_events import ChatEvent, ChatEventBuilder, DEFAULT_AGEN
58
58
  from sycommon.middleware.token_tracking import TokenTrackingMiddleware
59
59
  from sycommon.middleware.tool_result_truncation import ToolResultTruncationMiddleware
60
60
  from sycommon.agent.middleware.skill_write_guard import SkillWriteGuardMiddleware
61
+ from sycommon.agent.middleware.sensitive_guard import SensitiveGuardMiddleware
61
62
  from deepagents.middleware.summarization import create_summarization_tool_middleware # noqa: F401 保留 re-export
62
63
  from sycommon.agent.summarization_utils import build_summarization_middleware
63
64
 
@@ -367,6 +368,14 @@ class AgentConfig(BaseModel):
367
368
  model_name: Optional[str] = None
368
369
  model_temperature: float = 0.7
369
370
  model_thinking: bool = False
371
+ model_tier: str = "external" # "external"|"internal";internal 时跳过敏感检测
372
+ sensitive_guard: bool = True # 是否启用敏感信息检测守卫
373
+ # 敏感降级目标内部模型名(由应用层透传,避免基础库硬编码应用常量)
374
+ internal_model_name: Optional[str] = None
375
+ # 敏感检测提示词(应用层可覆盖);未传(None)用基础库 DEFAULT_DETECT_PROMPT
376
+ sensitive_detect_prompt: Optional[str] = None
377
+ # 命中敏感后的动作:"downgrade"=降级内部模型继续;"block"=直接阻断不执行
378
+ sensitive_action: str = "downgrade"
370
379
 
371
380
  # 系统提示词
372
381
  system_prompt: str = DEFAULT_SYSTEM_PROMPT
@@ -446,6 +455,7 @@ class DeepAgent:
446
455
  sandbox_backend: HTTPSandboxBackend,
447
456
  recovery_manager: Optional[SandboxRecoveryManager] = None,
448
457
  rubric_eval_collector: Optional[_RubricEvalCollector] = None,
458
+ sensitive_guard: Optional[SensitiveGuardMiddleware] = None,
449
459
  ):
450
460
  self.user_id = user_id
451
461
  self.agent = agent
@@ -453,6 +463,7 @@ class DeepAgent:
453
463
  self.sandbox_backend = sandbox_backend
454
464
  self.recovery_manager = recovery_manager
455
465
  self.rubric_eval_collector = rubric_eval_collector
466
+ self.sensitive_guard = sensitive_guard
456
467
 
457
468
  async def cleanup(self):
458
469
  """清理资源"""
@@ -508,7 +519,8 @@ class DeepAgent:
508
519
  ):
509
520
  # 🔑 逐 token 诊断日志:仅在 DEEP_AGENT_STREAM_DEBUG=true 时打印
510
521
  if _STREAM_DEBUG:
511
- _chunk_len = len(chunk) if isinstance(chunk, tuple) else '?'
522
+ _chunk_len = len(chunk) if isinstance(
523
+ chunk, tuple) else '?'
512
524
  if isinstance(chunk, tuple) and _chunk_len == 2:
513
525
  # 2-tuple: either (namespace, (msg, meta)) or (msg, meta)
514
526
  if isinstance(chunk[1], tuple) and len(chunk[1]) == 2:
@@ -533,7 +545,8 @@ class DeepAgent:
533
545
  _msg = payload_p[0]
534
546
  _meta = payload_p[1]
535
547
  _msg_type = type(_msg).__name__
536
- _content = repr(str(getattr(_msg, 'content', ''))[:80])
548
+ _content = repr(
549
+ str(getattr(_msg, 'content', ''))[:80])
537
550
  _node = _meta.get('langgraph_node', '?') if isinstance(
538
551
  _meta, dict) else '?'
539
552
  _step = _meta.get('langgraph_step', '?') if isinstance(
@@ -1221,7 +1234,22 @@ async def create_deep_agent(
1221
1234
  rubric_eval_collector = None
1222
1235
 
1223
1236
  # 构建 middleware 列表
1237
+ # 🔒 敏感信息检测守卫:插在最外层(最先执行),命中则会话内降级内部模型。
1238
+ # enabled=False / model_tier="internal" 时内部短路,零开销。
1239
+ # internal_model_name 由应用层透传(避免基础库硬编码应用常量);
1240
+ # 未传(None)时 middleware 内部用 get_llm() 读 nacos default 模型兜底。
1241
+ # sensitive_detect_prompt 由应用层透传覆盖默认检测提示词。
1242
+ # sensitive_action 决定命中后降级还是阻断。
1243
+ guard = SensitiveGuardMiddleware(
1244
+ model_tier=config.model_tier,
1245
+ enabled=config.sensitive_guard,
1246
+ internal_model_name=config.internal_model_name,
1247
+ detect_prompt=config.sensitive_detect_prompt,
1248
+ action=config.sensitive_action,
1249
+ )
1250
+
1224
1251
  middleware_list = [
1252
+ guard,
1225
1253
  ToolResultTruncationMiddleware(),
1226
1254
  TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
1227
1255
  summarization_mw,
@@ -1245,7 +1273,8 @@ async def create_deep_agent(
1245
1273
  try:
1246
1274
  from sycommon.agent.middleware.skill_api_whitelist import (
1247
1275
  SkillApiWhitelistMiddleware)
1248
- middleware_list.append(SkillApiWhitelistMiddleware(sandbox_backend))
1276
+ middleware_list.append(
1277
+ SkillApiWhitelistMiddleware(sandbox_backend))
1249
1278
  except Exception as _wl_err:
1250
1279
  SYLogger.warning(f"[DeepAgent] 技能接口白名单中间件加载失败(忽略): {_wl_err}")
1251
1280
 
@@ -1312,6 +1341,7 @@ async def create_deep_agent(
1312
1341
  sandbox_backend=sandbox_backend,
1313
1342
  recovery_manager=recovery_manager,
1314
1343
  rubric_eval_collector=rubric_eval_collector,
1344
+ sensitive_guard=guard,
1315
1345
  )
1316
1346
 
1317
1347
 
@@ -1390,8 +1420,18 @@ async def _sync_skills_to_sandbox(
1390
1420
  _skip_lazy_sync=True)
1391
1421
  if remote_content and remote_content.file_data:
1392
1422
  # FileData 是 TypedDict(dict), 用键访问而非属性
1393
- return _parse_skill_version(
1394
- remote_content.file_data.get("content", "") or "")
1423
+ content = remote_content.file_data.get("content", "") or ""
1424
+ # 沙箱 /read 对大文件( skill-creator 34KB SKILL.md)返回
1425
+ # encoding=base64,直接解析会因找不到 "version:" 行而误判为"无版本"
1426
+ # → 每次新建 Agent 都全量重传。base64 时先解码再解析。
1427
+ encoding = remote_content.file_data.get("encoding", "utf-8")
1428
+ if encoding == "base64" and content:
1429
+ try:
1430
+ import base64 as _b64
1431
+ content = _b64.b64decode(content).decode("utf-8", errors="replace")
1432
+ except Exception:
1433
+ pass
1434
+ return _parse_skill_version(content)
1395
1435
  except Exception:
1396
1436
  pass
1397
1437
  return ""
@@ -0,0 +1,429 @@
1
+ # -*- coding: utf-8 -*-
2
+ """敏感信息检测守卫中间件。
3
+
4
+ 每次模型调用前,用内部模型检测「即将发给外部模型的完整上下文」是否含
5
+ 数据外泄类敏感信息(个人信息组合 / 公司机密 / 凭证)。命中则:
6
+ - 会话内降级到内部模型(就地 request.override(model=内部模型raw层),不重跑本轮);
7
+ - 首个命中者通过 on_downgrade 回调发一次切换提示(CAS 保证)。
8
+
9
+ 降级状态由 DowngradeState 承载:单 agent 独立实例;multi-agent(协调者+子agent)
10
+ 共享同一实例,避免敏感数据通过委派链继续流向外部模型。
11
+
12
+ agent 本就是内部模型(model_tier="internal")时短路放行,不检测。
13
+ 检测失败 fail-close(视为敏感,降级内部模型)。
14
+ """
15
+ import asyncio
16
+ from typing import Any, Awaitable, Callable, List, Optional
17
+
18
+ from langchain.agents.middleware.types import (
19
+ AgentMiddleware, ContextT, ModelRequest, ModelResponse, ResponseT,
20
+ )
21
+ from langchain_core.messages import BaseMessage, HumanMessage, AIMessage
22
+ from pydantic import BaseModel
23
+
24
+ from sycommon.logging.kafka_log import SYLogger
25
+
26
+
27
+ # 敏感降级目标内部模型名:由应用层通过 AgentConfig.internal_model_name 显式传入。
28
+ # 未传入(None)时,检测器和降级目标都直接用 get_llm() 读取 nacos 配置的 default 模型,
29
+ # 基础库不写死任何模型名。
30
+
31
+ # 降级提示文案(按敏感来源区分)
32
+ NOTICE_FROM_INPUT = (
33
+ "您的任务经AI识别涉及到敏感信息,无法调用外部模型完成,"
34
+ "已自动切换至内部模型继续处理。"
35
+ )
36
+ NOTICE_FROM_HISTORY = (
37
+ "您的任务经AI识别记忆涉及到敏感信息,无法调用外部模型完成,"
38
+ "已自动切换至内部模型继续处理,您可输入'新建会话'消除记忆中的敏感信息。"
39
+ )
40
+ class SensitiveCheck(BaseModel):
41
+ """检测结果。"""
42
+ is_sensitive: bool
43
+ reason: str = ""
44
+ # 敏感信息来源:user_input(本次用户输入) / history(历史对话记忆) / tool_result(本轮工具执行结果)
45
+ source: str = "user_input"
46
+
47
+
48
+ class DowngradeState:
49
+ """降级状态容器(会话级)。
50
+
51
+ - 单 agent:独占一个实例。
52
+ - multi-agent:协调者 + 所有子 agent 共享同一实例,任一命中 → 全员降级。
53
+
54
+ 首个命中者通过 mark_downgraded 的 CAS 返回值决定是否发提示,避免重复。
55
+ """
56
+
57
+ def __init__(self):
58
+ self.downgraded = False
59
+ self.last_source = "user_input" # 首次命中时的敏感来源,供应用层选提示文案
60
+ self._lock = asyncio.Lock()
61
+
62
+ @property
63
+ def is_downgraded(self) -> bool:
64
+ return self.downgraded
65
+
66
+ async def mark_downgraded(self, source: str = "user_input") -> bool:
67
+ """CAS:返回 True 表示本次调用是首个触发降级的(应发提示),并记下来源。"""
68
+ async with self._lock:
69
+ if self.downgraded:
70
+ return False
71
+ self.downgraded = True
72
+ self.last_source = source
73
+ return True
74
+
75
+
76
+ DEFAULT_DETECT_PROMPT = """你是数据脱敏分类器。判断以下「即将发送给外部云模型」的对话上下文是否包含不宜外流的敏感数据,只回答结构化字段(is_sensitive + reason + source)。
77
+
78
+ 只有以下才算敏感(必须严格命中才算):
79
+ - 个人身份信息组合:姓名+手机号/身份证号/护照号/银行卡号 等能定位到具体个人的字段组合(单独一个姓名或一个邮箱不算)
80
+ - 公司机密:未公开的经营/财务/合同/客户清单等核心商业数据
81
+ - 真实明文凭证:实际的 token 值 / 明文密码 / 私钥 / access token 的具体值
82
+
83
+ 不算敏感(一律不要误判,即使出现也不选 is_sensitive):
84
+ - 内部系统接口地址、内部接口名、内部系统名(如 oa/eas/xxx-api)
85
+ - 环境变量名或占位符(如 ${SYT_TOKEN}、SYT_BASE_URL)—— 是"变量名/占位符",不是真实 token 值
86
+ - 内部文件路径、项目代号、沙箱路径、对话历史存档路径
87
+ - 单个员工姓名、域账号、工作邮箱(仅姓名+邮箱不构成隐私组合)
88
+ - 单独的部门名、岗位名、普通工作内容、通用业务讨论
89
+ - 公司内部知识库的通用知识、行业通识、业务规则概述
90
+
91
+ 判断原则:宁可放行也不要误判。只有当上下文出现「能定位到具体个人的完整身份/财务信息」或「真实的明文凭证值」时才判敏感。
92
+
93
+ 若判定 is_sensitive=true,还需指明 source(敏感信息最早出现的来源),三选一:
94
+ - "user_input":敏感信息出现在最后一条 HumanMessage(本次用户输入/本轮补充)中
95
+ - "tool_result":敏感信息出现在 ToolMessage(本轮工具执行后读取文档/查询产生的结果)中
96
+ - "history":敏感信息只出现在更早的历史对话(AI/人类历史消息、摘要)中,本次输入和本轮工具结果本身不含
97
+
98
+ 对话上下文:
99
+ {content}"""
100
+
101
+
102
+ def _messages_to_text(messages: List[BaseMessage]) -> str:
103
+ """把 messages 列表拼成检测用文本([Role] content)。"""
104
+ parts = []
105
+ for m in messages:
106
+ role = type(m).__name__
107
+ content = m.content
108
+ if isinstance(content, list):
109
+ # 多模态 content(如 [{'type':'text','text':...}])取文本拼接
110
+ content = " ".join(
111
+ str(c.get("text", "")) if isinstance(c, dict) else str(c)
112
+ for c in content
113
+ )
114
+ parts.append(f"[{role}] {content}")
115
+ return "\n".join(parts)
116
+
117
+
118
+ def _parse_detect_json(text: str) -> Optional[SensitiveCheck]:
119
+ """从模型原始文本里稳健提取 SensitiveCheck。
120
+
121
+ 容忍:前后多余文字、<think>…</think> 包裹、```json 代码块、
122
+ JSON 尾部跟自然语言("Extra data")等。无法解析返回 None(由调用方 fail-close)。
123
+ """
124
+ import json
125
+ import re
126
+
127
+ # 1) 先剥已闭合的 <think>…</think>(思维链不应参与解析,但模型常把 JSON 放在它后面)
128
+ text_no_think = re.sub(r"<think>.*?</think>", "", text, flags=re.DOTALL)
129
+ # 1b) 若 <think> 没闭合(模型把整个 JSON+回答都包在 think 里,常见漏闭合),
130
+ # 取 </think> 之后的部分(如果有);否则剥掉开头的 <think> 标签
131
+ if "</think>" in text and "<think>" not in text_no_think:
132
+ # 已无完整 think 对,但仍有闭合标签 → 取闭合后的内容
133
+ text_no_think = text_no_think.split("</think>", 1)[-1]
134
+ elif "<think>" in text_no_think:
135
+ # 残留未闭合 <think>:把它当普通文字剥掉(取 <think> 之后的内容)
136
+ text_no_think = text_no_think.split("<think>", 1)[-1]
137
+ # 2) 去 ```json / ``` 代码块围栏
138
+ text_clean = re.sub(r"```(?:json)?", "", text_no_think)
139
+ # 3) 取第一个 { 到最后一个 } 之间的片段(贪婪,吸收多对象/尾随文字场景)
140
+ start = text_clean.find("{")
141
+ end = text_clean.rfind("}")
142
+ # 注意:无大括号(纯 yaml/散文式)时不在此 return None —— 还要走 4c 正则兜底。
143
+ candidate = text_clean[start:end + 1] if (start != -1 and end != -1 and end > start) else ""
144
+
145
+ # 4) 直接解析;失败则按「JSON 尾部跟自然语言 / 多个对象」逐个试
146
+ def _try(s: str) -> Optional[SensitiveCheck]:
147
+ try:
148
+ data = json.loads(s)
149
+ if isinstance(data, dict):
150
+ # 模型常在不敏感时回 "source": null;source 是 str 字段,
151
+ # None 会让 Pydantic 校验失败 → 整体解析失败 → fail-close 误判敏感。
152
+ # 这里把 None 值剔除,让字段走默认值。
153
+ data = {k: v for k, v in data.items() if v is not None}
154
+ return SensitiveCheck(**data)
155
+ except Exception:
156
+ return None
157
+ return None
158
+
159
+ # 4a) 整体
160
+ chk = _try(candidate)
161
+ if chk is not None:
162
+ return chk
163
+
164
+ # 4b) 多个顶层 {...} 对象:取第一个完整对象(栈匹配大括号)
165
+ depth = 0
166
+ in_str = False
167
+ esc = False
168
+ for i, ch in enumerate(candidate):
169
+ if esc:
170
+ esc = False
171
+ continue
172
+ if ch == "\\":
173
+ esc = True
174
+ continue
175
+ if ch == '"':
176
+ in_str = not in_str
177
+ continue
178
+ if in_str:
179
+ continue
180
+ if ch == "{":
181
+ depth += 1
182
+ elif ch == "}":
183
+ depth -= 1
184
+ if depth == 0:
185
+ chk = _try(candidate[:i + 1])
186
+ if chk is not None:
187
+ return chk
188
+ # 第一个对象也解析失败,放弃
189
+ return None
190
+
191
+ # 4c) 兜底:模型把判定字段写成「- key: value」或「key: value」散文式
192
+ # (常见于 think 内,如 "- is_sensitive: true\n- reason: ...\n- source: tool_result",
193
+ # 或 "is_sensitive: true- reason: ..." 这种换行被吞的畸形文本)。
194
+ # 注意:在 4a/4b 走完仍未返回时才到这里,此时要么没大括号、
195
+ # 要么大括号是工具结果片段(不是判定 JSON),用正则从全文提判定字段更稳。
196
+ m_bool = re.search(r'is[_\s\-]*sensitive["\']?\s*[::]\s*(true|false)', text, re.I)
197
+ if m_bool:
198
+ data = {"is_sensitive": m_bool.group(1).lower() == "true"}
199
+ # reason: 取到行尾(容忍换行被吞成空格,遇下一个字段名停止)
200
+ m_reason = re.search(
201
+ r'reason["\']?\s*[::]\s*["\']?(.+?)(?=\s*(?:[\-]*\s*)?(?:reason|source|is[_\s\-]*sensitive)["\']?\s*[::]|$)',
202
+ text, re.I | re.DOTALL)
203
+ if m_reason:
204
+ r = m_reason.group(1).strip()
205
+ # 截到第一个换行(reason 不跨行)
206
+ r = r.split("\n", 1)[0].strip().strip('"\'')
207
+ if r:
208
+ data["reason"] = r
209
+ m_source = re.search(r'source["\']?\s*[::]\s*["\']?(user_input|tool_result|history)', text, re.I)
210
+ if m_source:
211
+ data["source"] = m_source.group(1).lower()
212
+ try:
213
+ return SensitiveCheck(**{k: v for k, v in data.items() if v is not None})
214
+ except Exception:
215
+ return None
216
+ return None
217
+
218
+
219
+ class SensitiveGuardMiddleware(AgentMiddleware):
220
+ """敏感信息检测 + 会话内降级到内部模型。"""
221
+
222
+ def __init__(
223
+ self,
224
+ model_tier: str,
225
+ internal_model_name: Optional[str] = None,
226
+ on_downgrade: Optional[Callable[[], Awaitable[None]]] = None,
227
+ enabled: bool = True,
228
+ state: Optional[DowngradeState] = None,
229
+ # 应用层可覆盖检测提示词;未传(None)用 DEFAULT_DETECT_PROMPT
230
+ detect_prompt: Optional[str] = None,
231
+ # 命中敏感后的动作:"downgrade"=降级内部模型继续;"block"=直接阻断(不调任何模型)
232
+ action: str = "downgrade",
233
+ # 阻断模式下的异步提示回调(与 on_downgrade 区分文案);downgrade 模式不用
234
+ on_block: Optional[Callable[[], Awaitable[None]]] = None,
235
+ # 测试注入:绕过懒加载的真实 get_llm
236
+ _detector: Any = None,
237
+ _internal_raw: Any = None,
238
+ ):
239
+ self._model_tier = model_tier
240
+ # None 时检测器/降级目标都用 get_llm() 读 nacos default 模型,不写死模型名
241
+ self._internal_name = internal_model_name
242
+ self._on_downgrade = on_downgrade
243
+ self._on_block = on_block
244
+ self._action = action if action in ("downgrade", "block") else "downgrade"
245
+ self._enabled = enabled
246
+ self._state = state or DowngradeState()
247
+ self._detect_prompt = detect_prompt or DEFAULT_DETECT_PROMPT
248
+ self._detector = _detector # 懒加载(None 时首次检测用 get_llm 建)
249
+ self._internal_raw = _internal_raw
250
+ self._init_lock = asyncio.Lock()
251
+
252
+ @property
253
+ def is_downgraded(self) -> bool:
254
+ return self._state.is_downgraded
255
+
256
+ @property
257
+ def is_blocked(self) -> bool:
258
+ """本会话是否已阻断(命中过敏感且 action=block)。"""
259
+ return self._state.is_downgraded and self._action == "block"
260
+
261
+ @property
262
+ def action(self) -> str:
263
+ return self._action
264
+
265
+ @property
266
+ def last_notice_source(self) -> str:
267
+ """首次命中时的敏感来源(user_input/tool_result/history),供应用层选文案。"""
268
+ return getattr(self._state, "last_source", "user_input")
269
+
270
+ @property
271
+ def state(self) -> DowngradeState:
272
+ return self._state
273
+
274
+ async def _get_detector(self):
275
+ if self._detector is None:
276
+ async with self._init_lock:
277
+ if self._detector is None:
278
+ from sycommon.llm.get_llm import get_llm
279
+ # wrap_structured=False:检测器直接拿原始文本,由 _detect 自行解析。
280
+ # 避免 with_structured_output 在 JSON 不合规时触发修正重试(烧 token、拖慢)。
281
+ # ⚠️ 必须用 ainvoke(非流式)+ 干净 config:本中间件在 awrap_model_call 里
282
+ # 被调用,此时 agent 的 _patched_execute_model_async 把检测器也当成普通模型
283
+ # 走 astream,导致 on_llm_new_token 把检测的 <think>/JSON token 推给
284
+ # StreamMessagesHandler → agent.chat() 当作 AI chunk yield 给应用层 →
285
+ # 用户看到脱敏分类器的思考过程。get_llm(wrap_structured=False) 返回的是
286
+ # LLMWithTokenTracking(BaseChatModel),其 ainvoke 走 _agenerate,不触发
287
+ # 流式回调;且这里用独立 config(不取 agent 的 StreamMessagesHandler),
288
+ # 从源头断开检测器与用户事件流。
289
+ self._detector = get_llm(
290
+ self._internal_name, temperature=0.0, wrap_structured=False)
291
+ return self._detector
292
+
293
+ async def _get_internal_raw(self):
294
+ if self._internal_raw is None:
295
+ async with self._init_lock:
296
+ if self._internal_raw is None:
297
+ from sycommon.llm.get_llm import get_llm
298
+ llm = get_llm(self._internal_name, streaming=True, wrap_structured=False)
299
+ # 取 raw 层(ChatOpenAI),与 agent 原模型 getattr(model,'llm',model) 对齐
300
+ self._internal_raw = getattr(llm, "llm", llm)
301
+ return self._internal_raw
302
+
303
+ async def _detect(self, messages: List[BaseMessage]) -> SensitiveCheck:
304
+ """一次检测:命中即返回 SensitiveCheck。fail-close(异常→视为敏感)。
305
+
306
+ 稳定性策略:
307
+ - 检测提示词只描述「判什么敏感」,不要求模型自己格式化输出;
308
+ - 直接用 detector.ainvoke 拿原始文本,本方法用正则提 {…} 再 Pydantic 解析;
309
+ - 单轮、零修正重试,避免 with_structured_output 的解析重试烧 token。
310
+ 解析失败时 fail-close 视为敏感(宁可错杀不让敏感外泄)。
311
+ """
312
+ import json
313
+ import re
314
+ content = _messages_to_text(messages)
315
+ try:
316
+ detector = await self._get_detector()
317
+ # 🔑 提示词模板里含 {content} 占位符(应用层 SENSITIVE_DETECT_PROMPT)。
318
+ # 这里手工替换(不走 langchain 模板):把完整上下文塞进去。
319
+ # 用字符串 split+join 避免提示词里其他 {xxx} 被 .format 误伤。
320
+ prompt = self._detect_prompt.replace("{content}", content) \
321
+ if "{content}" in self._detect_prompt \
322
+ else self._detect_prompt + content
323
+ # 🔑 隔离 agent 的流式回调上下文,防止检测器输出泄漏给用户。
324
+ # 本中间件在 agent 的模型节点内被调用,此刻 ContextVar
325
+ # var_child_runnable_config 持有 agent 的 config(含 StreamMessagesHandler
326
+ # 回调)。若直接 detector.ainvoke,langchain 会继承该回调,检测器的每个
327
+ # token 都触发 on_llm_new_token → 被当成 AI chunk yield 给用户,导致
328
+ # 脱敏分类器的 <think>/JSON 全部可见。这里临时清空该 ContextVar,调用完
329
+ # 恢复,让检测器在干净的上下文里跑(非流式、不进用户事件流)。
330
+ from langchain_core.runnables.config import var_child_runnable_config
331
+ _ctx_token = var_child_runnable_config.set({})
332
+ try:
333
+ raw = await detector.ainvoke(prompt)
334
+ finally:
335
+ var_child_runnable_config.reset(_ctx_token)
336
+ text = raw.content if isinstance(raw, BaseMessage) else str(raw)
337
+ check = _parse_detect_json(text)
338
+ if check is None:
339
+ SYLogger.warning(
340
+ f"[SensitiveGuard] 检测无有效JSON(fail-close→内部模型): {text[:500]!r}")
341
+ return SensitiveCheck(is_sensitive=True, reason="no_json_in_detect_output")
342
+ return check
343
+ except Exception as e:
344
+ SYLogger.warning(f"[SensitiveGuard] 检测异常(fail-close→内部模型): {e}")
345
+ return SensitiveCheck(is_sensitive=True, reason=f"detect_error:{e}")
346
+
347
+ async def awrap_model_call(
348
+ self,
349
+ request: ModelRequest[ContextT],
350
+ handler: Callable[[ModelRequest[ContextT]], Awaitable[ModelResponse[ResponseT]]],
351
+ ) -> ModelResponse[ResponseT]:
352
+ # (a) 关闭 / 内部 tier:纯放行,不检测(避免内部模型检内部模型 + 省 token)
353
+ if not self._enabled or self._model_tier == "internal":
354
+ return await handler(request)
355
+
356
+ # (b) 本会话已命中敏感
357
+ if self._state.is_downgraded:
358
+ # 阻断模式:直接返回空响应,不再调任何模型;应用层发完提示后会 break stream。
359
+ # 这里构造一个 content 空的 AIMessage,让 langgraph 把本轮当作模型已回完,
360
+ # 不进工具循环(无 tool_calls),干净结束。
361
+ if self._action == "block":
362
+ return ModelResponse(result=[AIMessage(content="")])
363
+ # 降级模式:路由内部模型继续;本次输入若非敏感(来自历史记忆)刷新 source=history
364
+ await self._refresh_source_if_history(request.messages)
365
+ return await handler(request.override(model=await self._get_internal_raw()))
366
+
367
+ # (c) 检测
368
+ check = await self._detect(request.messages)
369
+ if not check.is_sensitive:
370
+ return await handler(request)
371
+
372
+ # (d) 命中 → CAS 抢占;按 action 分流
373
+ is_first = await self._state.mark_downgraded(check.source)
374
+ if self._action == "block":
375
+ SYLogger.info(
376
+ f"[SensitiveGuard] 命中敏感信息,阻断执行: {check.reason} (source={check.source})")
377
+ if is_first and self._on_block:
378
+ try:
379
+ await self._on_block()
380
+ except Exception as e:
381
+ SYLogger.warning(f"[SensitiveGuard] 阻断提示回调失败: {e}")
382
+ # 不调 handler,返回空响应结束本轮
383
+ return ModelResponse(result=[AIMessage(content="")])
384
+ # downgrade 模式:发提示 + 路由内部模型继续执行
385
+ SYLogger.info(
386
+ f"[SensitiveGuard] 命中敏感信息,降级内部模型: {check.reason} (source={check.source})")
387
+ if is_first and self._on_downgrade:
388
+ try:
389
+ await self._on_downgrade()
390
+ except Exception as e:
391
+ SYLogger.warning(f"[SensitiveGuard] 提示回调失败: {e}")
392
+ return await handler(request.override(model=await self._get_internal_raw()))
393
+
394
+ async def _refresh_source_if_history(self, messages: List[BaseMessage]) -> None:
395
+ """已降级后的短路路径上调用:判断本次输入本身是否含敏感。
396
+
397
+ 场景:会话首次命中敏感(如查 LDAP 档案)后降级。用户紧接着发"今日金价"
398
+ 等本身不含敏感的消息——此刻敏感的来源是「历史记忆」,应用层应提示
399
+ NOTICE_FROM_HISTORY(带"新建会话"引导)。本方法用 detector 轻判「仅本次
400
+ 输入」是否敏感:不敏感 → 把 last_source 刷成 history;仍敏感 → 保持原值。
401
+
402
+ 注意:只在 last_source 还不是 history 时才刷(一旦判过 history 就稳定),
403
+ 避免反复抖动。轻判只看最后一条 HumanMessage,cost 低。
404
+ """
405
+ # 已是 history,无需再刷
406
+ if self._state.last_source == "history":
407
+ return
408
+ try:
409
+ # 取最后一条 HumanMessage 作为「本次输入」单独判
410
+ last_human = None
411
+ for m in reversed(messages):
412
+ if isinstance(m, HumanMessage):
413
+ last_human = m
414
+ break
415
+ if last_human is None:
416
+ return
417
+ check = await self._detect([last_human])
418
+ if not check.is_sensitive:
419
+ # 本次输入干净 → 敏感来自记忆
420
+ async with self._state._lock:
421
+ self._state.last_source = "history"
422
+ SYLogger.info(
423
+ "[SensitiveGuard] 已降级;本次输入非敏感,source 刷新为 history"
424
+ "(后续提示走「记忆」文案)")
425
+ except Exception as e:
426
+ # 兜底失败不影响短路路径,保持原 source
427
+ SYLogger.warning(f"[SensitiveGuard] refresh_source_if_history 失败(忽略): {e}")
428
+
429
+
@@ -46,6 +46,9 @@ from sycommon.agent.chat_events import ChatEvent, ChatEventBuilder, DEFAULT_AGEN
46
46
  from sycommon.middleware.token_tracking import TokenTrackingMiddleware
47
47
  from sycommon.middleware.tool_result_truncation import ToolResultTruncationMiddleware
48
48
  from sycommon.agent.middleware.skill_write_guard import SkillWriteGuardMiddleware
49
+ from sycommon.agent.middleware.sensitive_guard import (
50
+ SensitiveGuardMiddleware, DowngradeState,
51
+ )
49
52
  from deepagents.middleware.summarization import create_summarization_tool_middleware # noqa: F401 保留 re-export
50
53
  from sycommon.agent.summarization_utils import build_summarization_middleware
51
54
 
@@ -126,6 +129,11 @@ class TeamConfig(BaseModel):
126
129
  model_name: Optional[str] = None
127
130
  model_temperature: float = 0.7
128
131
  model_thinking: bool = False
132
+ model_tier: str = "external" # "external"|"internal";internal 时跳过敏感检测
133
+ sensitive_guard: bool = True # 是否启用敏感信息检测守卫
134
+ internal_model_name: Optional[str] = None # 敏感降级目标内部模型名(应用层透传)
135
+ sensitive_detect_prompt: Optional[str] = None # 敏感检测提示词(应用层覆盖)
136
+ sensitive_action: str = "downgrade" # "downgrade"=降级继续;"block"=阻断
129
137
 
130
138
  coordinator_prompt: str = ""
131
139
  coordinator_name: str = "项目经理"
@@ -190,6 +198,7 @@ class MultiAgentTeam:
190
198
  sandbox_backend: HTTPSandboxBackend,
191
199
  coordinator_name: str = "项目经理",
192
200
  recovery_manager: Optional[SandboxRecoveryManager] = None,
201
+ downgrade_state: Optional[DowngradeState] = None,
193
202
  ):
194
203
  self.user_id = user_id
195
204
  self.agent = agent
@@ -199,6 +208,12 @@ class MultiAgentTeam:
199
208
  self.coordinator_name = coordinator_name
200
209
  self.sandbox_backend = sandbox_backend
201
210
  self.recovery_manager = recovery_manager
211
+ self.downgrade_state = downgrade_state
212
+
213
+ @property
214
+ def is_downgraded(self) -> bool:
215
+ """敏感降级状态(协调者+子agent 共享,任一命中→True)。"""
216
+ return bool(self.downgrade_state and self.downgrade_state.is_downgraded)
202
217
 
203
218
  async def cleanup(self):
204
219
  """清理资源"""
@@ -608,7 +623,22 @@ async def create_multi_agent_team(
608
623
  from deepagents.middleware.subagents import CompiledSubAgent
609
624
 
610
625
  summarization_mw = build_summarization_middleware(model, config.model_name, sandbox_backend)
626
+ # 🔒 敏感检测:协调者 + 所有子 agent 共享一个 DowngradeState,
627
+ # 任一命中 → 全员降级(敏感数据会经委派链流动,独立 state 会漏)。
628
+ shared_downgrade_state = DowngradeState()
629
+
630
+ def _make_guard():
631
+ return SensitiveGuardMiddleware(
632
+ model_tier=config.model_tier,
633
+ enabled=config.sensitive_guard,
634
+ state=shared_downgrade_state,
635
+ internal_model_name=config.internal_model_name,
636
+ detect_prompt=config.sensitive_detect_prompt,
637
+ action=config.sensitive_action,
638
+ )
639
+
611
640
  middleware = [
641
+ _make_guard(),
612
642
  ToolResultTruncationMiddleware(),
613
643
  TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
614
644
  summarization_mw,
@@ -666,6 +696,7 @@ async def create_multi_agent_team(
666
696
  debug=config.debug,
667
697
  name=coord_name,
668
698
  middleware=[
699
+ _make_guard(),
669
700
  ToolResultTruncationMiddleware(),
670
701
  TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
671
702
  coord_summarization_mw,
@@ -683,6 +714,7 @@ async def create_multi_agent_team(
683
714
  sandbox_backend=sandbox_backend,
684
715
  coordinator_name=coord_name,
685
716
  recovery_manager=recovery_manager,
717
+ downgrade_state=shared_downgrade_state,
686
718
  )
687
719
 
688
720
 
@@ -14,3 +14,8 @@ current_llm_api_key = contextvars.ContextVar("llm_api_key", default=None)
14
14
  # None = 走 per-user 派生 key(默认,正常路径)
15
15
  # 沿 asyncio task 树传播,请求结束自动重置 → 每次新请求仍优先派生 key。
16
16
  llm_key_override = contextvars.ContextVar("llm_key_override", default=None)
17
+
18
+ # 当前请求来源:"web" | "wecom" | None。agent 创建入口(create_sy_deep_agent /
19
+ # stream_chat=web,create_wecom_agent=wecom)set,沿 task 树传播。
20
+ # authorize 等工具据此分流:web 走二维码弹窗、企微走 markdown 链接。
21
+ current_chat_source = contextvars.ContextVar("chat_source", default=None)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.7a12
3
+ Version: 0.2.7a14
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown