sycommon-python-lib 0.2.8a4__tar.gz → 0.2.8a6__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 (363) hide show
  1. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/deep_agent.py +0 -15
  4. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/egress_wall.py +2 -2
  5. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/sandbox.py +14 -0
  6. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/sandbox_gateway.py +36 -11
  7. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  8. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -4
  9. sycommon_python_lib-0.2.8a4/src/sycommon/agent/middleware/sitecustomize.py +0 -300
  10. sycommon_python_lib-0.2.8a4/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -479
  11. sycommon_python_lib-0.2.8a4/src/sycommon/agent/middleware/skill_wl_check.py +0 -123
  12. sycommon_python_lib-0.2.8a4/src/sycommon/config/SkillApiWhitelistConfig.py +0 -87
  13. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/README.md +0 -0
  14. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/setup.cfg +0 -0
  15. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/__init__.py +0 -0
  16. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/cli.py +0 -0
  17. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/core/__init__.py +0 -0
  18. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/core/console.py +0 -0
  19. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/core/models.py +0 -0
  20. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/core/project.py +0 -0
  21. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/core/utils.py +0 -0
  22. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/__init__.py +0 -0
  23. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/README.md.tpl +0 -0
  24. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/__init__.py +0 -0
  25. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/api/query.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/app.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/db/service.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/model/parse.py.tpl +0 -0
  43. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  44. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  45. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/.env.tpl +0 -0
  46. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/.gitignore.tpl +0 -0
  47. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/Dockerfile.tpl +0 -0
  48. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/README.md.tpl +0 -0
  49. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/__init__.py +0 -0
  50. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/app.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/app.yaml.tpl +0 -0
  52. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  53. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/client/__init__.py.tpl +0 -0
  54. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/model/__init__.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/model/file_info.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/requirements.txt.tpl +0 -0
  57. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/README.md.tpl +0 -0
  58. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/__init__.py +0 -0
  59. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/app.py.tpl +0 -0
  60. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  61. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  62. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  63. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/README.md.tpl +0 -0
  65. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/__init__.py +0 -0
  66. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/api/__init__.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/api/echo.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/app.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/client/__init__.py.tpl +0 -0
  72. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/model/__init__.py.tpl +0 -0
  73. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/tools/mq.py.tpl +0 -0
  75. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/nexus/__init__.py +0 -0
  76. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/__init__.py +0 -0
  77. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/__main__.py +0 -0
  78. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/acp/__init__.py +0 -0
  79. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/acp/config.py +0 -0
  80. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/acp/executor.py +0 -0
  81. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/acp/registry.py +0 -0
  82. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/acp/server.py +0 -0
  83. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/agents/__init__.py +0 -0
  84. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/agents/factory.py +0 -0
  85. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/agents/prompts.py +0 -0
  86. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/__init__.py +0 -0
  87. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/browser.py +0 -0
  88. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/__init__.py +0 -0
  89. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/console.py +0 -0
  90. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/dom.py +0 -0
  91. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/network.py +0 -0
  92. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  93. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/performance.py +0 -0
  94. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  95. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/client.py +0 -0
  96. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/protocol.py +0 -0
  97. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/repl.py +0 -0
  98. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cli.py +0 -0
  99. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/__init__.py +0 -0
  100. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/acp_cmd.py +0 -0
  101. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/cdp_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/chat_cmd.py +0 -0
  103. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/create_cmd.py +0 -0
  104. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/evaluate_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/init_cmd.py +0 -0
  106. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/memory_cmd.py +0 -0
  107. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/resume_cmd.py +0 -0
  108. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/rollback_cmd.py +0 -0
  109. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/run_cmd.py +0 -0
  110. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/__init__.py +0 -0
  111. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/backend.py +0 -0
  112. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/config.py +0 -0
  113. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/display.py +0 -0
  114. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/git_integration.py +0 -0
  115. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/llm.py +0 -0
  116. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/state.py +0 -0
  117. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/evaluate/__init__.py +0 -0
  118. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/evaluate/api_evaluator.py +0 -0
  119. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/__init__.py +0 -0
  120. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/compressor.py +0 -0
  121. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/full.py +0 -0
  122. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/hot.py +0 -0
  123. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/manager.py +0 -0
  124. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/warm.py +0 -0
  125. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/mode/__init__.py +0 -0
  126. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/mode/create.py +0 -0
  127. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/mode/optimize.py +0 -0
  128. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/models/__init__.py +0 -0
  129. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/models/config_models.py +0 -0
  130. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/__init__.py +0 -0
  131. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/baseline_tests.py +0 -0
  132. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/checkpoint.py +0 -0
  133. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/convergence.py +0 -0
  134. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/diagnosis.py +0 -0
  135. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/engine.py +0 -0
  136. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/environment.py +0 -0
  137. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/experience.py +0 -0
  138. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/harness_prompts.py +0 -0
  139. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/history.py +0 -0
  140. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/optimization_logger.py +0 -0
  141. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/pre_validation.py +0 -0
  142. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/reward.py +0 -0
  143. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/strategy_bandit.py +0 -0
  144. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/strategy_generator.py +0 -0
  145. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/strategy_prompts.py +0 -0
  146. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/simple_chat_agent.py +0 -0
  147. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/skills/__init__.py +0 -0
  148. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/__init__.py +0 -0
  149. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/__init__.py +0 -0
  150. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/acp/__init__.py +0 -0
  151. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/acp/client.py +0 -0
  152. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/acp/fetch.py +0 -0
  153. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/acp/ssh_init.py +0 -0
  154. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/acp/tool.py +0 -0
  155. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/agent_manager.py +0 -0
  156. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/chat_events.py +0 -0
  157. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/mcp/__init__.py +0 -0
  158. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/mcp/models.py +0 -0
  159. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  160. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/middleware/model_request_prep.py +0 -0
  161. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
  162. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  163. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  164. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/multi_agent_team.py +0 -0
  165. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/reasoning_content_patch.py +0 -0
  166. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/resume_compactor.py +0 -0
  167. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/__init__.py +0 -0
  168. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  169. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  170. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  171. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  172. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  173. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  174. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/session.py +0 -0
  175. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/summarization_utils.py +0 -0
  176. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/__init__.py +0 -0
  177. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/ldap_service.py +0 -0
  178. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/oa_cache.py +0 -0
  179. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/oa_crypto.py +0 -0
  180. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/oa_service.py +0 -0
  181. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  182. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/ACPAgentConfig.py +0 -0
  183. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/Config.py +0 -0
  184. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/DatabaseConfig.py +0 -0
  185. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/EgressPolicyConfig.py +0 -0
  186. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  187. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/EmbeddingConfig.py +0 -0
  188. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/LLMConfig.py +0 -0
  189. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/LangfuseConfig.py +0 -0
  190. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/MQConfig.py +0 -0
  191. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/PgConfig.py +0 -0
  192. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/RedisConfig.py +0 -0
  193. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/RerankerConfig.py +0 -0
  194. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/SentryConfig.py +0 -0
  195. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/XxlJobConfig.py +0 -0
  196. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/__init__.py +0 -0
  197. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/config_change_notifier.py +0 -0
  198. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/async_base_db_service.py +0 -0
  199. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/async_database_service.py +0 -0
  200. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/base_db_service.py +0 -0
  201. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/database_service.py +0 -0
  202. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/elasticsearch_service.py +0 -0
  203. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  204. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/redis_service.py +0 -0
  205. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/resilient_pg_saver.py +0 -0
  206. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/token_usage_db_service.py +0 -0
  207. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/health/__init__.py +0 -0
  208. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/health/health_check.py +0 -0
  209. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/health/metrics.py +0 -0
  210. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/health/ping.py +0 -0
  211. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/heartbeat_process/__init__.py +0 -0
  212. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  213. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  214. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  215. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/__init__.py +0 -0
  216. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/embedding.py +0 -0
  217. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/get_llm.py +0 -0
  218. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/llm_logger.py +0 -0
  219. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/llm_tokens.py +0 -0
  220. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  221. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  222. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  223. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/struct_token.py +0 -0
  224. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/sy_langfuse.py +0 -0
  225. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  226. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  227. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/token_usage_es_service.py +0 -0
  228. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  229. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/token_utils.py +0 -0
  230. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/usage_token.py +0 -0
  231. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/__init__.py +0 -0
  232. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/async_sql_logger.py +0 -0
  233. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/kafka_log.py +0 -0
  234. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/log_masker.py +0 -0
  235. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/logger_levels.py +0 -0
  236. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/logger_wrapper.py +0 -0
  237. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/process_logger.py +0 -0
  238. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/sql_logger.py +0 -0
  239. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/mcp_server/__init__.py +0 -0
  240. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/mcp_server/server.py +0 -0
  241. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/__init__.py +0 -0
  242. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/context.py +0 -0
  243. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/cors.py +0 -0
  244. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/docs.py +0 -0
  245. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/exception.py +0 -0
  246. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/middleware.py +0 -0
  247. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/monitor_memory.py +0 -0
  248. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/mq.py +0 -0
  249. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/timeout.py +0 -0
  250. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/token_tracking.py +0 -0
  251. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  252. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/traceid.py +0 -0
  253. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/__init__.py +0 -0
  254. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/base_http.py +0 -0
  255. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/log.py +0 -0
  256. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/mcp_server_config.py +0 -0
  257. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/mqlistener_config.py +0 -0
  258. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/mqmsg_model.py +0 -0
  259. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/mqsend_config.py +0 -0
  260. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/sandbox.py +0 -0
  261. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/sso_user.py +0 -0
  262. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/token_usage.py +0 -0
  263. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/token_usage_mysql.py +0 -0
  264. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/xxljob_handler_config.py +0 -0
  265. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/notice/__init__.py +0 -0
  266. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  267. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/notice/wecom_message.py +0 -0
  268. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  269. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  270. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  271. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  272. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  273. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  274. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  275. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  276. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  277. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/sentry/__init__.py +0 -0
  278. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/sentry/sy_sentry.py +0 -0
  279. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/services.py +0 -0
  280. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/sse/__init__.py +0 -0
  281. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/sse/event.py +0 -0
  282. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/sse/sse.py +0 -0
  283. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/__init__.py +0 -0
  284. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/example.py +0 -0
  285. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/example2.py +0 -0
  286. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/feign.py +0 -0
  287. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/feign_client.py +0 -0
  288. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_client_base.py +0 -0
  289. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  290. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  291. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_service.py +0 -0
  292. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  293. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  294. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/param.py +0 -0
  295. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/deep_agent_server.py +0 -0
  296. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_backend_factory_compat.py +0 -0
  297. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consistent_hash.py +0 -0
  298. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consume_dedup.py +0 -0
  299. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  300. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  301. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consumer_recovery_fix.py +0 -0
  302. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consumer_tags_sync.py +0 -0
  303. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_deep_agent.py +0 -0
  304. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  305. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_email.py +0 -0
  306. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_encoding_cache.py +0 -0
  307. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_env_tenant_helper.py +0 -0
  308. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -0
  309. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -0
  310. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_fault_injection_real.py +0 -0
  311. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_fix_verification.py +0 -0
  312. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_heartbeat_timeout.py +0 -0
  313. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_integration_real_broker.py +0 -0
  314. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_mcp_server.py +0 -0
  315. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  316. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_mq.py +0 -0
  317. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_mq_config_driven.py +0 -0
  318. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_nacos_llm_real.py +0 -0
  319. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_oa_login.py +0 -0
  320. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  321. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -0
  322. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_real_summarization.py +0 -0
  323. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_reconnect_scenarios.py +0 -0
  324. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_summarization_config.py +0 -0
  325. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_summarization_real.py +0 -0
  326. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  327. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
  328. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
  329. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_upgrade_verification.py +0 -0
  330. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/__init__.py +0 -0
  331. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/async_utils.py +0 -0
  332. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/docs.py +0 -0
  333. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/env.py +0 -0
  334. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/merge_headers.py +0 -0
  335. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/snowflake.py +0 -0
  336. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/syemail.py +0 -0
  337. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/time_utils.py +0 -0
  338. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/timing.py +0 -0
  339. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/user_id.py +0 -0
  340. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/xxljob/__init__.py +0 -0
  341. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/xxljob/xxljob_service.py +0 -0
  342. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  343. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  344. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  345. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  346. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_acp_tool.py +0 -0
  347. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_asyncio_logging.py +0 -0
  348. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_config_change_notifier.py +0 -0
  349. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_hotreload_snapshot.py +0 -0
  350. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_llm_apikey_contextvar.py +0 -0
  351. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_log_masker.py +0 -0
  352. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_resilient_pg_saver.py +0 -0
  353. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_sandbox_path_guard.py +0 -0
  354. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_sensitive_guard.py +0 -0
  355. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_simple_chat_agent.py +0 -0
  356. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_skill_regex_upgrade.py +0 -0
  357. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_skill_write_guard.py +0 -0
  358. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_streaming_e2e.py +0 -0
  359. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_sycli.py +0 -0
  360. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_sync_skills_to_sandbox.py +0 -0
  361. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_time_utils.py +0 -0
  362. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_upload_concurrency.py +0 -0
  363. {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_upload_e2e_http.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.8a4
3
+ Version: 0.2.8a6
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.8a4"
3
+ version = "0.2.8a6"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1274,21 +1274,6 @@ async def create_deep_agent(
1274
1274
  on_evaluation=rubric_eval_collector.on_evaluation,
1275
1275
  ))
1276
1276
 
1277
- # SkillApiWhitelistMiddleware(旧管控层):已被出网收口取代——
1278
- # 沙箱网关(egress gateway)做 path 白名单+凭据注入,iptables 硬墙(egress_wall)
1279
- # 在内核层挡 node/裸socket。旧的 .wl 推送/sitecustomize monkeypatch/shell-guard
1280
- # 不再注册(子进程 env 零密钥后 sitecustomize 的 SYT_API_AUTHZ 注入也已由网关承接)。
1281
- # 回滚开关: 环境变量 SANDBOX_LEGACY_WHITELIST=1 时恢复注册(应急用)。
1282
- if sandbox_backend and os.environ.get("SANDBOX_LEGACY_WHITELIST", "") == "1":
1283
- try:
1284
- from sycommon.agent.middleware.skill_api_whitelist import (
1285
- SkillApiWhitelistMiddleware)
1286
- middleware_list.append(
1287
- SkillApiWhitelistMiddleware(sandbox_backend))
1288
- SYLogger.warning("[DeepAgent] 旧白名单中间件已启用(SANDBOX_LEGACY_WHITELIST=1 应急模式)")
1289
- except Exception as _wl_err:
1290
- SYLogger.warning(f"[DeepAgent] 技能接口白名单中间件加载失败(忽略): {_wl_err}")
1291
-
1292
1277
  agent_kwargs = {
1293
1278
  "model": raw_model,
1294
1279
  "tools": config.tools or [get_current_date],
@@ -13,8 +13,8 @@ EgressPolicy 来自沙箱自己的 Nacos dataId(shengye-platform-sandbox)的
13
13
  EgressPolicy 段(见 sycommon/config/EgressPolicyConfig.py),Nacos 热更新后
14
14
  调 refresh_egress_wall() 重配。
15
15
 
16
- 这是 L3/L4 内核级硬墙,语言无关、绕不过——比应用层 hook(sitecustomize/
17
- LD_PRELOAD/HTTPS_PROXY)强且无盲区。
16
+ 这是 L3/L4 内核级硬墙,语言无关、绕不过——比旧应用层 hook(已删的
17
+ monkeypatch/LD_PRELOAD 等)强且无盲区。
18
18
 
19
19
  设计要点:
20
20
  - owner-match(-m owner --uid-owner):只锁 child uid,沙箱服务进程(root/其它 uid)
@@ -971,6 +971,20 @@ def setup_sandbox_handler(app: FastAPI, config: dict = None):
971
971
  env["TEMP"] = os.path.join(workspace, "tmp")
972
972
  env["TMP"] = os.path.join(workspace, "tmp")
973
973
  env["SANDBOX_ROOT"] = workspace
974
+ # 签名型凭据豁免(企微文档机器人):WECOM_DOC_BOT_* 用于【本地 HMAC 签名】
975
+ # (sign=sha256(secret+bot_id+t+nonce)),签名必须在发起方算,网关无法代注
976
+ # ——这是收口「零密钥」的已知例外。流量仍走网关(URL 指网关+X-Upstream-Host,
977
+ # 受白名单/审计管制),只是 secret 必须到脚本手里。仅当凭据包里有才注入。
978
+ try:
979
+ from sycommon.middleware.sandbox_gateway import credential_store
980
+ _c = credential_store().any_user()
981
+ _creds = credential_store().get(_c) if _c else None
982
+ for _k in ("WECOM_DOC_BOT_ID", "WECOM_DOC_BOT_SECRET"):
983
+ _v = (_creds or {}).get(_k)
984
+ if _v:
985
+ env[_k] = str(_v)
986
+ except Exception:
987
+ pass
974
988
  # 出网网关:子进程 SYT_BASE_URL 指向网关(http://127.0.0.1:port),
975
989
  # HTTPS_PROXY 让 requests/httpx/curl/wget 自动走网关。node/裸 socket 不读
976
990
  # proxy 的运行时,由后续 seccomp 硬墙兜底(只放行网关 host:port)。
@@ -6,7 +6,7 @@
6
6
  1. 按「目标 host → 凭据形态」注入正确凭据(SYT 用 Authorization Bearer +
7
7
  X-Sy-Api-Authz;OA 系用 SYU-Token + SYU-Url 改写;企微 gettoken 用
8
8
  URL query 的 corpid/corpsecret;内网服务无鉴权透传)。
9
- 2. 复用 skill_wl_check.match path 白名单校验,不在白名单 → 403。
9
+ 2. host/path 白名单校验(EgressPolicy 驱动),不在名单 → 403。
10
10
  3. 删子进程自带的凭据头(Authorization/SYU-Token/X-Sy-Api-Authz),由网关
11
11
  重新注入正确值(防子进程塞脏值/旧值)。
12
12
  4. 审计:每个请求记录 user/host/path/状态码/字节量。
@@ -116,15 +116,22 @@ def _strip_cred_headers(headers) -> dict:
116
116
 
117
117
 
118
118
  def _apply_credentials(method: str, target_url: str, headers: dict,
119
- creds: dict) -> tuple[str, dict]:
119
+ creds: dict, upstream_host: str = "") -> tuple[str, dict]:
120
120
  """按目标 host/path 改写 URL(query 注入)+ 注入凭据头。返回 (url, headers)。
121
121
 
122
122
  网关→真上游的请求构造在此完成。host 路由表见模块 docstring。
123
+ upstream_host: 请求头 X-Upstream-Host 的值(网关 origin 模式下 URL host 是
124
+ 网关自身,真实目标在该头里)——凭据路由优先按它判定,其次按 URL host。
123
125
  """
124
126
  host = (urlparse(target_url).hostname or "").lower()
127
+ # 网关 origin 模式:URL host 是 127.0.0.1(网关),真实目标在 X-Upstream-Host;
128
+ # 凭据路由按真实目标判定(取两者中非网关地址的那个)。
129
+ route_host = host
130
+ if upstream_host:
131
+ route_host = (urlparse(f"https://{upstream_host}").hostname or "").lower()
125
132
 
126
133
  # --- SYT 网关:Bearer + X-Sy-Api-Authz + X-Host-Name ---
127
- if _match_syt_upstream(host, creds.get("SYT_BASE_URL", "")):
134
+ if _match_syt_upstream(route_host, creds.get("SYT_BASE_URL", "")):
128
135
  token = creds.get("SYT_TOKEN", "")
129
136
  if token:
130
137
  headers["Authorization"] = f"Bearer {token}"
@@ -137,7 +144,7 @@ def _apply_credentials(method: str, target_url: str, headers: dict,
137
144
  return target_url, headers
138
145
 
139
146
  # --- 企微 gettoken:corpid/corpsecret 在 URL query ---
140
- if _is_wecom(host):
147
+ if _is_wecom(route_host):
141
148
  corp_id = creds.get("WECOM_CORP_ID", "")
142
149
  corp_secret = creds.get("WECOM_CORP_SECRET", "")
143
150
  if corp_id and corp_secret and "/cgi-bin/gettoken" in target_url:
@@ -146,10 +153,12 @@ def _apply_credentials(method: str, target_url: str, headers: dict,
146
153
  q.setdefault("corpid", corp_id)
147
154
  q.setdefault("corpsecret", corp_secret)
148
155
  target_url = urlunparse(parsed._replace(query=urlencode(q)))
156
+ # 企微文档机器人(wecom.py 的 MCP 网关)用 DOC_BOT 凭据签名——不在此注入
157
+ # (wecom.py 本地算签名),只保证 gettoken 的 corp 凭据注入。
149
158
  return target_url, headers
150
159
 
151
160
  # --- OA MCP 后端:SYU-Token + SYU-Url(改写为真上游 base)---
152
- if _is_oa_backend(host):
161
+ if _is_oa_backend(route_host):
153
162
  token = creds.get("SYT_TOKEN", "")
154
163
  syt_base = (creds.get("SYT_BASE_URL") or "").rstrip("/")
155
164
  if token:
@@ -231,7 +240,7 @@ def _check_allowlist(target_url: str, creds: dict,
231
240
 
232
241
 
233
242
  def _url_allowed(url: str, allowlist: list[str]) -> bool:
234
- """与 skill_wl_check._is_allowed 同构的 path 级前缀匹配(不依赖 env)。"""
243
+ """path 级前缀匹配(斜杠边界)。"""
235
244
  try:
236
245
  p = urlparse(url if "://" in url else "http://" + str(url))
237
246
  except Exception:
@@ -412,9 +421,23 @@ class EgressGateway:
412
421
  syt_base = (creds.get("SYT_BASE_URL") or "").rstrip("/")
413
422
  if upstream_host:
414
423
  # SSRF 防护:上游 host 禁止指向回环/本机/私有网段(本机服务含沙箱
415
- # 自身 API,免鉴权,打穿即跨用户任意执行)。非回环的 10.x/172.16-31.x/
416
- # 192.168.x 内网目标按 EgressPolicy 判定(directAllow 命中才放)。
417
- if _is_loopback_or_private(upstream_host):
424
+ # 自身 API,免鉴权,打穿即跨用户任意执行)。例外:EgressPolicy
425
+ # viaGateway/directAllow 显式登记的【信任内网上游】(如 OA MCP
426
+ # ai.syitservice.com→10.10.1.171)——它们是内网服务但有意经营,
427
+ # 不属于 SSRF 攻击面(策略由 _check_allowlist 继续管)。
428
+ policy = None
429
+ try:
430
+ from sycommon.config.EgressPolicyConfig import EgressPolicyConfig
431
+ policy = EgressPolicyConfig.from_config()
432
+ except Exception:
433
+ policy = None
434
+ trusted = []
435
+ if policy is not None:
436
+ trusted = list(policy.viaGateway) + list(policy.directAllow)
437
+ uh_hostname = upstream_host.split(":")[0] if upstream_host.count(":") <= 1 \
438
+ else upstream_host
439
+ if (_is_loopback_or_private(upstream_host)
440
+ and not EgressPolicyConfig._host_match(uh_hostname.lower(), trusted)):
418
441
  SYLogger.warning(
419
442
  f"[EgressGateway] 拒绝内网/回环上游(SSRF 防护): {upstream_host}")
420
443
  return web.Response(status=403, text="gateway: upstream host not allowed")
@@ -446,9 +469,11 @@ class EgressGateway:
446
469
  continue
447
470
  fwd_headers[k] = v
448
471
 
449
- # 注入凭据头 / 改写 URL(query 注入)
472
+ # 注入凭据头 / 改写 URL(query 注入)。
473
+ # upstream_host 透传给凭据路由:网关 origin 模式下 URL host 是网关自身,
474
+ # 真实目标在 X-Upstream-Host——OA(ai.sy)/企微按它判路由。
450
475
  target_url, fwd_headers = _apply_credentials(
451
- request.method, target_url, fwd_headers, creds)
476
+ request.method, target_url, fwd_headers, creds, upstream_host)
452
477
 
453
478
  # 读请求体(上传场景)
454
479
  body = await request.read() if request.can_read_body else None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.8a4
3
+ Version: 0.2.8a6
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -154,9 +154,6 @@ src/sycommon/agent/mcp/tool_loader.py
154
154
  src/sycommon/agent/middleware/model_request_prep.py
155
155
  src/sycommon/agent/middleware/sandbox_path_guard.py
156
156
  src/sycommon/agent/middleware/sensitive_guard.py
157
- src/sycommon/agent/middleware/sitecustomize.py
158
- src/sycommon/agent/middleware/skill_api_whitelist.py
159
- src/sycommon/agent/middleware/skill_wl_check.py
160
157
  src/sycommon/agent/middleware/skill_write_guard.py
161
158
  src/sycommon/agent/sandbox/__init__.py
162
159
  src/sycommon/agent/sandbox/consistent_hash.py
@@ -185,7 +182,6 @@ src/sycommon/config/PgConfig.py
185
182
  src/sycommon/config/RedisConfig.py
186
183
  src/sycommon/config/RerankerConfig.py
187
184
  src/sycommon/config/SentryConfig.py
188
- src/sycommon/config/SkillApiWhitelistConfig.py
189
185
  src/sycommon/config/XxlJobConfig.py
190
186
  src/sycommon/config/__init__.py
191
187
  src/sycommon/config/config_change_notifier.py
@@ -1,300 +0,0 @@
1
- """技能接口白名单客户端注入脚本(部署到沙箱 site-packages)。
2
-
3
- Python 解释器启动时(未传 -S)自动 import 本模块。它负责 Python HTTP 库的
4
- 请求拦截:
5
-
6
- 1. 读环境变量 SKILL_API_WHITELIST(JSON)。无此 env → 不管控(全放行,fail-open)。
7
- 2. monkeypatch urllib / httpx / requests / aiohttp,发请求前做 path 级前缀匹配,
8
- 未命中抛 PermissionError(LLM 能看到清晰错误)。
9
-
10
- ⚠️ shell 命令(curl/wget 等)的拦截【不】在本文件处理——sitecustomize 只在
11
- `python` 启动时执行,纯 shell 命令不会触发它。shell 拦截由主进程中间件把
12
- curl/wget 包装函数【内联】到每条 execute 命令前缀实现(见 skill_api_whitelist.py)。
13
-
14
- URL 匹配核心逻辑复用同目录 skill_wl_check.py。
15
-
16
- 另外提供【独立于白名单】的 header 注入:当环境变量 SYT_API_AUTHZ 非空时,
17
- 对 host 命中 SYT_BASE_URL 的请求自动补 X-Sy-Api-Authz 头。这是云平台网关的
18
- 鉴权要求,对所有沙箱技能请求生效(不门控白名单),由中间件无条件 export
19
- SYT_API_AUTHZ + 推送本 sitecustomize 触发。
20
-
21
- 注意:本模块在沙箱子进程里运行,不依赖主进程内存。配置全部来自环境变量。
22
- """
23
-
24
- import json
25
- import os
26
- import sys
27
- from urllib.parse import urlparse
28
-
29
- # SKILL_API_WHITELIST 存在即「启用管控」;allowlist 为空时「全拦截」。
30
- _ENABLED = "SKILL_API_WHITELIST" in os.environ
31
-
32
- # 把沙箱 site-packages 里存放本模块的目录加入 sys.path,以便 import skill_wl_check。
33
- _HERE = os.path.dirname(os.path.abspath(__file__))
34
- if _HERE not in sys.path:
35
- sys.path.insert(0, _HERE)
36
-
37
-
38
- def _load_check():
39
- """加载同目录 skill_wl_check,返回其 match 函数;失败返回 None。"""
40
- try:
41
- import skill_wl_check # type: ignore
42
- return skill_wl_check
43
- except Exception as e: # pragma: no cover
44
- sys.stderr.write("[sitecustomize] 加载 skill_wl_check 失败,白名单禁用: %s\n" % e)
45
- return None
46
-
47
-
48
- def _patch_urllib(match):
49
- import urllib.request
50
-
51
- _orig = urllib.request.urlopen
52
-
53
- def _urlopen(url, *args, **kwargs):
54
- actual = url.full_url if isinstance(url, urllib.request.Request) else url
55
- if actual and not match(str(actual)):
56
- raise PermissionError(
57
- "[SkillApiWhitelist] 拦截: URL 不在白名单内 (urlopen, %s)" % actual)
58
- return _orig(url, *args, **kwargs)
59
-
60
- urllib.request.urlopen = _urlopen
61
-
62
-
63
- def _patch_httpx(match):
64
- try:
65
- import httpx
66
- except ImportError:
67
- return
68
-
69
- _orig_sync = httpx.Client.send
70
-
71
- def _send(self, request, **kwargs):
72
- if not match(str(request.url)):
73
- raise PermissionError(
74
- "[SkillApiWhitelist] 拦截: URL 不在白名单内 (httpx, %s)" % request.url)
75
- return _orig_sync(self, request, **kwargs)
76
-
77
- httpx.Client.send = _send
78
-
79
- if hasattr(httpx, "AsyncClient"):
80
- _orig_async = httpx.AsyncClient.send
81
-
82
- async def _asend(self, request, **kwargs):
83
- if not match(str(request.url)):
84
- raise PermissionError(
85
- "[SkillApiWhitelist] 拦截: URL 不在白名单内 (httpx.async, %s)" % request.url)
86
- return await _orig_async(self, request, **kwargs)
87
-
88
- httpx.AsyncClient.send = _asend
89
-
90
-
91
- def _patch_requests(match):
92
- try:
93
- import requests
94
- except ImportError:
95
- return
96
-
97
- _orig = requests.Session.request
98
-
99
- def _request(self, method, url, *args, **kwargs):
100
- if not match(str(url)):
101
- raise PermissionError(
102
- "[SkillApiWhitelist] 拦截: URL 不在白名单内 (requests %s, %s)"
103
- % (method.upper(), url))
104
- return _orig(self, method, url, *args, **kwargs)
105
-
106
- requests.Session.request = _request
107
-
108
-
109
- def _patch_aiohttp(match):
110
- try:
111
- import aiohttp
112
- except ImportError:
113
- return
114
- if not hasattr(aiohttp.ClientSession, "_request"):
115
- return
116
-
117
- _orig = aiohttp.ClientSession._request
118
-
119
- async def _request(self, method, str_or_url, **kwargs):
120
- if not match(str(str_or_url)):
121
- raise PermissionError(
122
- "[SkillApiWhitelist] 拦截: URL 不在白名单内 (aiohttp %s, %s)"
123
- % (method, str_or_url))
124
- return await _orig(self, method, str_or_url, **kwargs)
125
-
126
- aiohttp.ClientSession._request = _request
127
-
128
-
129
- # =============== header 注入(独立于白名单)===============
130
- # 云平台网关要求请求带 X-Sy-Api-Authz 头。仅当 host 命中 SYT_BASE_URL 的 host
131
- # 才补该头,其它域名(内网 OCR / 企微 / 合同比对内网 / MCP 后端等)不注入。
132
- # 门控:环境变量 SYT_API_AUTHZ 非空。调用方已显式设过同名头则不覆盖。
133
-
134
- _AUTHZ_HEADER = "X-Sy-Api-Authz"
135
-
136
-
137
- def _syt_host():
138
- """解析 SYT_BASE_URL 的 host(小写)。失败返回 None。"""
139
- base = os.environ.get("SYT_BASE_URL", "").strip()
140
- if not base:
141
- return None
142
- try:
143
- return (urlparse(base).hostname or "").lower() or None
144
- except Exception:
145
- return None
146
-
147
-
148
- def _host_matches_syt(url) -> bool:
149
- """请求 URL 的 host 是否等于 SYT_BASE_URL 的 host。"""
150
- host = _syt_host()
151
- if not host:
152
- return False
153
- try:
154
- return (urlparse(str(url)).hostname or "").lower() == host
155
- except Exception:
156
- return False
157
-
158
-
159
- def _patch_urllib_hdr():
160
- import urllib.request
161
-
162
- _orig = urllib.request.urlopen
163
-
164
- def _urlopen(url, *args, **kwargs):
165
- # 只能给 Request 对象补头;裸 str URL 在 urlopen 层无 headers 概念,跳过
166
- if isinstance(url, urllib.request.Request) and _host_matches_syt(url.full_url):
167
- url.add_header(_AUTHZ_HEADER, os.environ["SYT_API_AUTHZ"])
168
- return _orig(url, *args, **kwargs)
169
-
170
- urllib.request.urlopen = _urlopen
171
-
172
-
173
- def _patch_requests_hdr():
174
- try:
175
- import requests
176
- except ImportError:
177
- return
178
-
179
- _orig = requests.Session.request
180
-
181
- def _request(self, method, url, *args, **kwargs):
182
- if _host_matches_syt(url):
183
- headers = kwargs.get("headers")
184
- if headers is None:
185
- headers = {}
186
- if isinstance(headers, dict):
187
- if _AUTHZ_HEADER not in headers:
188
- headers[_AUTHZ_HEADER] = os.environ["SYT_API_AUTHZ"]
189
- kwargs["headers"] = headers
190
- else:
191
- # list / 其它形态:保守起见交给底层,避免破坏既有结构
192
- pass
193
- return _orig(self, method, url, *args, **kwargs)
194
-
195
- requests.Session.request = _request
196
-
197
-
198
- def _patch_httpx_hdr():
199
- try:
200
- import httpx
201
- except ImportError:
202
- return
203
-
204
- def _apply(request):
205
- if request is not None and _host_matches_syt(request.url):
206
- request.headers.setdefault(_AUTHZ_HEADER, os.environ["SYT_API_AUTHZ"])
207
-
208
- _orig_sync = httpx.Client.send
209
-
210
- def _send(self, request, **kwargs):
211
- _apply(request)
212
- return _orig_sync(self, request, **kwargs)
213
-
214
- httpx.Client.send = _send
215
-
216
- if hasattr(httpx, "AsyncClient"):
217
- _orig_async = httpx.AsyncClient.send
218
-
219
- async def _asend(self, request, **kwargs):
220
- _apply(request)
221
- return await _orig_async(self, request, **kwargs)
222
-
223
- httpx.AsyncClient.send = _asend
224
-
225
-
226
- def _patch_aiohttp_hdr():
227
- try:
228
- import aiohttp
229
- except ImportError:
230
- return
231
- if not hasattr(aiohttp.ClientSession, "_request"):
232
- return
233
-
234
- _orig = aiohttp.ClientSession._request
235
-
236
- async def _request(self, method, str_or_url, **kwargs):
237
- if _host_matches_syt(str_or_url):
238
- headers = kwargs.get("headers")
239
- if isinstance(headers, dict):
240
- if _AUTHZ_HEADER not in headers:
241
- headers[_AUTHZ_HEADER] = os.environ["SYT_API_AUTHZ"]
242
- elif headers is None:
243
- kwargs["headers"] = {_AUTHZ_HEADER: os.environ["SYT_API_AUTHZ"]}
244
- else:
245
- # list / CIMultiDict 等其它形态:跳过,避免破坏结构
246
- pass
247
- return await _orig(self, method, str_or_url, **kwargs)
248
-
249
- aiohttp.ClientSession._request = _request
250
-
251
-
252
- def _install_header_injection():
253
- """装 header 注入 patch(独立于白名单)。
254
-
255
- 门控:环境变量 SYT_API_AUTHZ 非空。任一库 import 失败都不阻断。
256
- """
257
- val = os.environ.get("SYT_API_AUTHZ", "").strip()
258
- if not val:
259
- return
260
- if not _syt_host():
261
- sys.stderr.write(
262
- "[sitecustomize] SYT_API_AUTHZ 已设置但 SYT_BASE_URL 无法解析 host,"
263
- "跳过 header 注入\n")
264
- return
265
- _patch_urllib_hdr()
266
- _patch_requests_hdr()
267
- _patch_httpx_hdr()
268
- _patch_aiohttp_hdr()
269
-
270
-
271
- def _install():
272
- if not _ENABLED:
273
- return
274
- check = _load_check()
275
- if check is None:
276
- return
277
- # allowlist 为空(明确禁止)时也走校验——match 必然 False,从而全拦截。
278
- match = check.match
279
- _patch_urllib(match)
280
- _patch_httpx(match)
281
- _patch_requests(match)
282
- _patch_aiohttp(match)
283
-
284
-
285
- # 保留解析结果(供排查)
286
- try:
287
- _WHITELIST_RAW = json.loads(os.environ.get("SKILL_API_WHITELIST", "{}"))
288
- except Exception:
289
- _WHITELIST_RAW = {}
290
-
291
- try:
292
- _install()
293
- except Exception as _e: # 任何 patch 失败都不能阻断进程启动
294
- sys.stderr.write("[sitecustomize] 白名单安装失败(fail-open): %s\n" % _e)
295
-
296
- # header 注入独立于白名单,单独 try/except,互不影响
297
- try:
298
- _install_header_injection()
299
- except Exception as _e:
300
- sys.stderr.write("[sitecustomize] header 注入安装失败(fail-open): %s\n" % _e)