sycommon-python-lib 0.2.8a3__tar.gz → 0.2.8a5__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.8a3 → sycommon_python_lib-0.2.8a5}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/deep_agent.py +7 -3
  4. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/middleware/skill_api_whitelist.py +49 -10
  5. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/Config.py +22 -12
  6. sycommon_python_lib-0.2.8a5/src/sycommon/config/EgressPolicyConfig.py +183 -0
  7. sycommon_python_lib-0.2.8a5/src/sycommon/middleware/egress_wall.py +268 -0
  8. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/sandbox.py +197 -2
  9. sycommon_python_lib-0.2.8a5/src/sycommon/middleware/sandbox_gateway.py +567 -0
  10. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/sandbox.py +26 -1
  11. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/services.py +29 -1
  12. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  13. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon_python_lib.egg-info/SOURCES.txt +3 -0
  14. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/README.md +0 -0
  15. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/setup.cfg +0 -0
  16. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/__init__.py +0 -0
  17. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/cli.py +0 -0
  18. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/core/__init__.py +0 -0
  19. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/core/console.py +0 -0
  20. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/core/models.py +0 -0
  21. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/core/project.py +0 -0
  22. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/core/utils.py +0 -0
  23. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/__init__.py +0 -0
  24. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/README.md.tpl +0 -0
  25. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/__init__.py +0 -0
  26. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/api/query.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/app.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/db/service.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  43. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/model/parse.py.tpl +0 -0
  44. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  45. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  46. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/.env.tpl +0 -0
  47. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/.gitignore.tpl +0 -0
  48. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/Dockerfile.tpl +0 -0
  49. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/README.md.tpl +0 -0
  50. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/__init__.py +0 -0
  51. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/app.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/app.yaml.tpl +0 -0
  53. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  54. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/client/__init__.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/model/__init__.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/model/file_info.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/base/requirements.txt.tpl +0 -0
  58. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/cli/README.md.tpl +0 -0
  59. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/cli/__init__.py +0 -0
  60. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/cli/app.py.tpl +0 -0
  61. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  62. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  64. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/README.md.tpl +0 -0
  66. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/__init__.py +0 -0
  67. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/api/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/api/echo.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/app.py.tpl +0 -0
  72. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/client/__init__.py.tpl +0 -0
  73. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/model/__init__.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  75. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/command/templates/web/tools/mq.py.tpl +0 -0
  76. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/nexus/__init__.py +0 -0
  77. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/__init__.py +0 -0
  78. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/__main__.py +0 -0
  79. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/acp/__init__.py +0 -0
  80. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/acp/config.py +0 -0
  81. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/acp/executor.py +0 -0
  82. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/acp/registry.py +0 -0
  83. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/acp/server.py +0 -0
  84. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/agents/__init__.py +0 -0
  85. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/agents/factory.py +0 -0
  86. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/agents/prompts.py +0 -0
  87. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/__init__.py +0 -0
  88. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/browser.py +0 -0
  89. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/capabilities/__init__.py +0 -0
  90. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/capabilities/console.py +0 -0
  91. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/capabilities/dom.py +0 -0
  92. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/capabilities/network.py +0 -0
  93. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  94. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/capabilities/performance.py +0 -0
  95. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  96. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/client.py +0 -0
  97. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/protocol.py +0 -0
  98. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cdp/repl.py +0 -0
  99. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/cli.py +0 -0
  100. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/__init__.py +0 -0
  101. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/acp_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/cdp_cmd.py +0 -0
  103. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/chat_cmd.py +0 -0
  104. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/create_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/evaluate_cmd.py +0 -0
  106. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/init_cmd.py +0 -0
  107. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/memory_cmd.py +0 -0
  108. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/resume_cmd.py +0 -0
  109. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/rollback_cmd.py +0 -0
  110. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/commands/run_cmd.py +0 -0
  111. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/core/__init__.py +0 -0
  112. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/core/backend.py +0 -0
  113. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/core/config.py +0 -0
  114. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/core/display.py +0 -0
  115. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/core/git_integration.py +0 -0
  116. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/core/llm.py +0 -0
  117. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/core/state.py +0 -0
  118. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/evaluate/__init__.py +0 -0
  119. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/evaluate/api_evaluator.py +0 -0
  120. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/memory/__init__.py +0 -0
  121. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/memory/compressor.py +0 -0
  122. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/memory/full.py +0 -0
  123. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/memory/hot.py +0 -0
  124. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/memory/manager.py +0 -0
  125. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/memory/warm.py +0 -0
  126. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/mode/__init__.py +0 -0
  127. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/mode/create.py +0 -0
  128. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/mode/optimize.py +0 -0
  129. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/models/__init__.py +0 -0
  130. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/models/config_models.py +0 -0
  131. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/__init__.py +0 -0
  132. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/baseline_tests.py +0 -0
  133. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/checkpoint.py +0 -0
  134. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/convergence.py +0 -0
  135. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/diagnosis.py +0 -0
  136. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/engine.py +0 -0
  137. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/environment.py +0 -0
  138. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/experience.py +0 -0
  139. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/harness_prompts.py +0 -0
  140. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/history.py +0 -0
  141. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/optimization_logger.py +0 -0
  142. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/pre_validation.py +0 -0
  143. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/reward.py +0 -0
  144. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/strategy_bandit.py +0 -0
  145. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/strategy_generator.py +0 -0
  146. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/rl/strategy_prompts.py +0 -0
  147. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/simple_chat_agent.py +0 -0
  148. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycli/skills/__init__.py +0 -0
  149. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/__init__.py +0 -0
  150. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/__init__.py +0 -0
  151. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/acp/__init__.py +0 -0
  152. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/acp/client.py +0 -0
  153. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/acp/fetch.py +0 -0
  154. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/acp/ssh_init.py +0 -0
  155. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/acp/tool.py +0 -0
  156. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/agent_manager.py +0 -0
  157. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/chat_events.py +0 -0
  158. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/mcp/__init__.py +0 -0
  159. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/mcp/models.py +0 -0
  160. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  161. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/middleware/model_request_prep.py +0 -0
  162. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
  163. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  164. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
  165. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
  166. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  167. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/multi_agent_team.py +0 -0
  168. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/reasoning_content_patch.py +0 -0
  169. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/resume_compactor.py +0 -0
  170. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/sandbox/__init__.py +0 -0
  171. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  172. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  173. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  174. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  175. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  176. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  177. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/sandbox/session.py +0 -0
  178. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/agent/summarization_utils.py +0 -0
  179. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/auth/__init__.py +0 -0
  180. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/auth/ldap_service.py +0 -0
  181. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/auth/oa_cache.py +0 -0
  182. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/auth/oa_crypto.py +0 -0
  183. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/auth/oa_service.py +0 -0
  184. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  185. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/ACPAgentConfig.py +0 -0
  186. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/DatabaseConfig.py +0 -0
  187. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  188. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/EmbeddingConfig.py +0 -0
  189. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/LLMConfig.py +0 -0
  190. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/LangfuseConfig.py +0 -0
  191. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/MQConfig.py +0 -0
  192. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/PgConfig.py +0 -0
  193. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/RedisConfig.py +0 -0
  194. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/RerankerConfig.py +0 -0
  195. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/SentryConfig.py +0 -0
  196. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
  197. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/XxlJobConfig.py +0 -0
  198. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/__init__.py +0 -0
  199. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/config/config_change_notifier.py +0 -0
  200. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/database/async_base_db_service.py +0 -0
  201. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/database/async_database_service.py +0 -0
  202. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/database/base_db_service.py +0 -0
  203. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/database/database_service.py +0 -0
  204. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/database/elasticsearch_service.py +0 -0
  205. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  206. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/database/redis_service.py +0 -0
  207. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/database/resilient_pg_saver.py +0 -0
  208. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/database/token_usage_db_service.py +0 -0
  209. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/health/__init__.py +0 -0
  210. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/health/health_check.py +0 -0
  211. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/health/metrics.py +0 -0
  212. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/health/ping.py +0 -0
  213. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/heartbeat_process/__init__.py +0 -0
  214. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  215. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  216. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  217. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/__init__.py +0 -0
  218. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/embedding.py +0 -0
  219. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/get_llm.py +0 -0
  220. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/llm_logger.py +0 -0
  221. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/llm_tokens.py +0 -0
  222. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  223. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  224. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  225. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/struct_token.py +0 -0
  226. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/sy_langfuse.py +0 -0
  227. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  228. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  229. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/token_usage_es_service.py +0 -0
  230. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  231. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/token_utils.py +0 -0
  232. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/llm/usage_token.py +0 -0
  233. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/logging/__init__.py +0 -0
  234. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/logging/async_sql_logger.py +0 -0
  235. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/logging/kafka_log.py +0 -0
  236. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/logging/log_masker.py +0 -0
  237. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/logging/logger_levels.py +0 -0
  238. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/logging/logger_wrapper.py +0 -0
  239. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/logging/process_logger.py +0 -0
  240. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/logging/sql_logger.py +0 -0
  241. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/mcp_server/__init__.py +0 -0
  242. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/mcp_server/server.py +0 -0
  243. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/__init__.py +0 -0
  244. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/context.py +0 -0
  245. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/cors.py +0 -0
  246. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/docs.py +0 -0
  247. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/exception.py +0 -0
  248. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/middleware.py +0 -0
  249. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/monitor_memory.py +0 -0
  250. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/mq.py +0 -0
  251. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/timeout.py +0 -0
  252. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/token_tracking.py +0 -0
  253. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  254. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/middleware/traceid.py +0 -0
  255. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/__init__.py +0 -0
  256. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/base_http.py +0 -0
  257. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/log.py +0 -0
  258. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/mcp_server_config.py +0 -0
  259. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/mqlistener_config.py +0 -0
  260. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/mqmsg_model.py +0 -0
  261. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/mqsend_config.py +0 -0
  262. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/sso_user.py +0 -0
  263. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/token_usage.py +0 -0
  264. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/token_usage_mysql.py +0 -0
  265. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/models/xxljob_handler_config.py +0 -0
  266. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/notice/__init__.py +0 -0
  267. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  268. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/notice/wecom_message.py +0 -0
  269. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  270. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  271. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  272. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  273. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  274. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  275. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  276. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  277. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  278. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/sentry/__init__.py +0 -0
  279. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/sentry/sy_sentry.py +0 -0
  280. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/sse/__init__.py +0 -0
  281. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/sse/event.py +0 -0
  282. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/sse/sse.py +0 -0
  283. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/__init__.py +0 -0
  284. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/example.py +0 -0
  285. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/example2.py +0 -0
  286. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/feign.py +0 -0
  287. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/feign_client.py +0 -0
  288. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/nacos_client_base.py +0 -0
  289. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  290. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  291. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/nacos_service.py +0 -0
  292. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  293. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  294. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/synacos/param.py +0 -0
  295. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/deep_agent_server.py +0 -0
  296. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_backend_factory_compat.py +0 -0
  297. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_consistent_hash.py +0 -0
  298. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_consume_dedup.py +0 -0
  299. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  300. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  301. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_consumer_recovery_fix.py +0 -0
  302. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_consumer_tags_sync.py +0 -0
  303. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_deep_agent.py +0 -0
  304. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  305. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_email.py +0 -0
  306. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_encoding_cache.py +0 -0
  307. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_env_tenant_helper.py +0 -0
  308. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -0
  309. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -0
  310. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_fault_injection_real.py +0 -0
  311. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_fix_verification.py +0 -0
  312. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_heartbeat_timeout.py +0 -0
  313. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_integration_real_broker.py +0 -0
  314. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_mcp_server.py +0 -0
  315. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  316. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_mq.py +0 -0
  317. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_mq_config_driven.py +0 -0
  318. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_nacos_llm_real.py +0 -0
  319. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_oa_login.py +0 -0
  320. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  321. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -0
  322. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_real_summarization.py +0 -0
  323. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_reconnect_scenarios.py +0 -0
  324. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_summarization_config.py +0 -0
  325. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_summarization_real.py +0 -0
  326. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  327. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
  328. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
  329. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tests/test_upgrade_verification.py +0 -0
  330. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tools/__init__.py +0 -0
  331. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tools/async_utils.py +0 -0
  332. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tools/docs.py +0 -0
  333. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tools/env.py +0 -0
  334. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tools/merge_headers.py +0 -0
  335. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tools/snowflake.py +0 -0
  336. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tools/syemail.py +0 -0
  337. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tools/time_utils.py +0 -0
  338. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tools/timing.py +0 -0
  339. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/tools/user_id.py +0 -0
  340. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/xxljob/__init__.py +0 -0
  341. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon/xxljob/xxljob_service.py +0 -0
  342. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  343. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  344. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  345. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  346. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_acp_tool.py +0 -0
  347. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_asyncio_logging.py +0 -0
  348. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_config_change_notifier.py +0 -0
  349. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_hotreload_snapshot.py +0 -0
  350. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_llm_apikey_contextvar.py +0 -0
  351. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_log_masker.py +0 -0
  352. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_resilient_pg_saver.py +0 -0
  353. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_sandbox_path_guard.py +0 -0
  354. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_sensitive_guard.py +0 -0
  355. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_simple_chat_agent.py +0 -0
  356. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_skill_regex_upgrade.py +0 -0
  357. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_skill_write_guard.py +0 -0
  358. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_streaming_e2e.py +0 -0
  359. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_sycli.py +0 -0
  360. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_sync_skills_to_sandbox.py +0 -0
  361. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_time_utils.py +0 -0
  362. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/tests/test_upload_concurrency.py +0 -0
  363. {sycommon_python_lib-0.2.8a3 → sycommon_python_lib-0.2.8a5}/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.8a3
3
+ Version: 0.2.8a5
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.8a3"
3
+ version = "0.2.8a5"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1274,14 +1274,18 @@ async def create_deep_agent(
1274
1274
  on_evaluation=rubric_eval_collector.on_evaluation,
1275
1275
  ))
1276
1276
 
1277
- # SkillApiWhitelistMiddleware:按子技能注入接口白名单(拦 execute 工具,
1278
- # export SKILL_API_WHITELIST + 推送 sitecustomize 到沙箱做 path 级校验)
1279
- if sandbox_backend:
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":
1280
1283
  try:
1281
1284
  from sycommon.agent.middleware.skill_api_whitelist import (
1282
1285
  SkillApiWhitelistMiddleware)
1283
1286
  middleware_list.append(
1284
1287
  SkillApiWhitelistMiddleware(sandbox_backend))
1288
+ SYLogger.warning("[DeepAgent] 旧白名单中间件已启用(SANDBOX_LEGACY_WHITELIST=1 应急模式)")
1285
1289
  except Exception as _wl_err:
1286
1290
  SYLogger.warning(f"[DeepAgent] 技能接口白名单中间件加载失败(忽略): {_wl_err}")
1287
1291
 
@@ -174,19 +174,58 @@ def _load_resource_bytes(filename: str) -> bytes:
174
174
 
175
175
 
176
176
  def _build_shell_guard(with_whitelist: bool = False,
177
- with_header: bool = False) -> str:
177
+ with_header: bool = False,
178
+ with_rewrite_to_gateway: bool = False) -> str:
178
179
  """生成内联到命令前缀的 curl/wget 包装函数(shell)。
179
180
 
180
- 抽取参数里【最后一个】 http(s) URL 到 _u,按需承担两类职责(可同时启用,
181
- 先白名单校验、再注入 header):
182
- - with_whitelist:用沙箱 python3 调 skill_wl_check.match 校验 _u,未命中 return 1。
183
- - with_header:_u 的 host 命中 $__SYT_HOST__ 时追加 -H "X-Sy-Api-Authz:
184
- $SYT_API_AUTHZ"(原参数已含同名头则不重复加)。
181
+ 抽取参数里【最后一个】 http(s) URL 到 _u,按需承担三类职责(可同时启用):
182
+ - with_rewrite_to_gateway:把 _u 的真上游 URL 改写成网关 URL
183
+ (http://127.0.0.1:port,真 host X-Upstream-Host 头),凭据头剥除。
184
+ 收口模式下子进程 SYT_BASE_URL 已是网关,多数脚本自动走网关;此分支兜底
185
+ 硬编码 https://<真上游> 的 curl/wget 命令(绕过 SYT_BASE_URL)。
186
+ - with_whitelist:网关已做白名单,此处保留为纵深(沙箱 python3 校验)。
187
+ - with_header:收口后凭据由网关注入,此分支仅在未启用收口(兼容旧部署)时生效。
185
188
 
186
189
  skill_wl_check 与 sitecustomize 同处 site-packages,python3 启动时 sitecustomize
187
190
  会 import 它并把该目录加入 sys.path。覆盖 curl / wget;其它 shell 出网方式
188
- (nc/裸 /dev/tcp 等)不覆盖。
191
+ (nc/裸 /dev/tcp 等)不覆盖(由 seccomp 硬墙兜底)。
189
192
  """
193
+ rewrite_block = ""
194
+ if with_rewrite_to_gateway:
195
+ # _u 形如 https://syapi.x.com/path?qs。改写为 http://127.0.0.1:$__GW_PORT__/path?qs,
196
+ # 真上游 host 进 X-Upstream-Header,并剥除 Authorization/SYU-Token/X-Sy-Api-Authz
197
+ # (网关重新注入正确凭据)。port 取自子进程 SYT_BASE_URL(收口已注入网关地址)。
198
+ # 修审核 P1-6:重写后的 URL 必须替换 "$@" 里的原 URL 参数(旧实现只改了
199
+ # 校验变量 _u,curl 实际仍直连真上游)。URL 参数判定:与 _u 原值相等的参数。
200
+ # 注:该分支当前无调用方启用(旧白名单中间件已注销,收口走 SYT_BASE_URL
201
+ # 指向网关),保留为 legacy 应急路径并修正确性。
202
+ rewrite_block = (
203
+ 'if [ -n "$_u" ]; then '
204
+ # 取真上游 host(去 scheme/path/port)
205
+ '_rh="${_u#*://}"; _rh="${_rh%%/*}"; _rh="${_rh%%\\?*}"; _rh="${_rh%%:*}"; '
206
+ # 取 path?query
207
+ '_rp="${_u#*://}"; _rp="${_rp#*/}"; '
208
+ '[ "$_rp" = "$_u#*://" ] && _rp=""; '
209
+ '[ -n "$_rp" ] && _rp="/$_rp"; '
210
+ # 网关地址来自 SYT_BASE_URL(收口已注入 http://127.0.0.1:port)
211
+ '_gw="${SYT_BASE_URL%%/}"; '
212
+ 'if [ -n "$__GW_PORT__" ]; then _gw="http://127.0.0.1:$__GW_PORT__"; fi; '
213
+ 'if [ -n "$_gw" ] && [ -n "$_rh" ]; then '
214
+ '_rw="$_gw$_rp"; '
215
+ # 重建参数:剥凭据头 + 把原 URL 参数替换为网关 URL(P1-6 修)
216
+ 'set -- "$@"; _new=(); _skip=0; '
217
+ 'for _a in "$@"; do '
218
+ 'if [ "$_skip" = "1" ]; then _skip=0; continue; fi; '
219
+ 'case "$_a" in '
220
+ '"-H"|"--header") _skip=1; continue;; '
221
+ '"Authorization:"*|"SYU-Token:"*|"X-Sy-Api-Authz:"*|"SYU-Url:"*) continue;; '
222
+ '"$_u") _new+=("$_rw"); continue;; '
223
+ 'esac; _new+=("$_a"); done; '
224
+ 'set -- "${_new[@]}" -H "X-Upstream-Host: $_rh"; '
225
+ '_u="$_rw"; '
226
+ 'fi; '
227
+ 'fi; '
228
+ )
190
229
  wl_block = ""
191
230
  if with_whitelist:
192
231
  check_cmd = (
@@ -199,7 +238,7 @@ def _build_shell_guard(with_whitelist: bool = False,
199
238
  )
200
239
  hdr_block = ""
201
240
  if with_header:
202
- # _u 取 host(小写):剥 scheme/path/query/fragment/userinfo/port
241
+ # 仅兼容旧部署(未收口)的 X-Sy-Api-Authz 注入。收口模式下网关注入,跳过。
203
242
  hdr_block = (
204
243
  'if [ -n "$_u" ] && [ -n "$__SYT_HOST__" ] && [ -n "$SYT_API_AUTHZ" ]; then '
205
244
  '_h="${_u#*://}"; _h="${_h%%/*}"; _h="${_h%%\\?*}"; _h="${_h%%#*}"; '
@@ -212,12 +251,12 @@ def _build_shell_guard(with_whitelist: bool = False,
212
251
  'esac; '
213
252
  'fi; '
214
253
  )
215
- if not wl_block and not hdr_block:
254
+ if not wl_block and not hdr_block and not rewrite_block:
216
255
  return ""
217
256
  body = (
218
257
  '() { local _u _a _h; for _a in "$@"; do '
219
258
  'case "$_a" in http://*|https://*) _u="$_a";; esac; done; '
220
- + wl_block + hdr_block +
259
+ + rewrite_block + wl_block + hdr_block +
221
260
  'command {CMD} "$@"; };'
222
261
  )
223
262
  guard = "curl" + body.replace("{CMD}", "curl") + " wget" + body.replace("{CMD}", "wget")
@@ -201,19 +201,29 @@ class Config(metaclass=SingletonMeta):
201
201
  self.config = {**self.config, **
202
202
  share_configs.get('llm', {}), **share_configs}
203
203
 
204
- # Project-specific override: if the Nacos config whose dataId matches
205
- # the application Name contains LLMConfig/EmbeddingConfig/RerankerConfig,
206
- # those entries take priority (full override) over the shared llm defaults.
204
+ # Project-specific override: the Nacos config whose dataId matches the
205
+ # application Name (e.g. shengye-platform-digital-work) takes priority
206
+ # over everything above, at top level.
207
+ #
208
+ # 历史:曾用写死的 override_keys 白名单(LLMConfig/SkillApiWhitelist/...)
209
+ # 提升项目 dataId 的顶层 key——每新增一个配置段都要改库,易漏。
210
+ # 现改为【全量提升】:项目 dataId 的所有顶层 key 均覆盖到顶层,例外:
211
+ # - spring:数据库连接以 setup_database 的 shareConfigKey 指向源为准
212
+ # (如 common.yml),项目 dataId 的 spring 不覆盖,防止连错库;
213
+ # - Nacos/Name/Host/Port 等本地启动键:属于 app.yaml 启动配置,
214
+ # 不允许远端覆盖(防止热更新破坏服务注册/监听地址)。
215
+ # 向后兼容:原白名单内的 key 行为不变(依旧覆盖),新增 key 自动生效。
207
216
  app_name = self.config.get('Name', '')
208
217
  project_cfg = share_configs.get(app_name, {})
209
- # 这些 key 写在「与 app 同名的 dataId」里(如 shengye-platform-digital-work),
210
- # 但消费方按顶层 key 读取(LLMConfig 等)——提升到顶层,免得每个调用方都得知道嵌套路径。
211
- override_keys = ['LLMConfig', 'EmbeddingConfig', 'RerankerConfig',
212
- 'ACPAgentConfig',
213
- 'SkillApiWhitelist',
214
- 'SensitiveConfig']
215
- for k in override_keys:
216
- if k in project_cfg:
217
- self.config[k] = project_cfg[k]
218
+ if isinstance(project_cfg, dict):
219
+ # 本地启动键:app.yaml 的进程级配置,远端不覆盖
220
+ _LOCAL_BOOT_KEYS = frozenset((
221
+ 'Name', 'Host', 'Port', 'Workers', 'MaxBytes', 'Timeout',
222
+ 'MaxRetries', 'Nacos', 'Version',
223
+ ))
224
+ for k, v in project_cfg.items():
225
+ if k in _LOCAL_BOOT_KEYS or k == 'spring':
226
+ continue
227
+ self.config[k] = v
218
228
 
219
229
  self._process_config()
@@ -0,0 +1,183 @@
1
+ """沙箱出网策略配置模型。
2
+
3
+ 配置来源:沙箱服务自己的 Nacos dataId(`shengye-platform-sandbox`)下的
4
+ `EgressPolicy` 段。硬墙(egress_wall)与网关(sandbox_gateway)都跑在沙箱进程,
5
+ 直接读本地 Config,不依赖主进程推送——出网策略是【沙箱的部署属性】。
6
+
7
+ EgressPolicy:
8
+ directAllow: # 直连放行(无凭据不注入):内网无鉴权服务/公网查询类
9
+ - "10.10.13.32" # 具体条目优先于管制判定
10
+ - "zxgk.court.gov.cn"
11
+ # 其余外网: DROP(不可配,防数据外泄是硬墙本意)
12
+
13
+ 【管制判定不配置,自动推导】:目标 host 与凭据包 SYT_BASE_URL(真上游,主进程
14
+ 按环境解析:prod=syapi.sytechnology.com / test=cloudapi-*.syitservice.com)
15
+ 同域名 → 管制(仅网关可达,凭据注入+审计)。也就是说「凡 ${SYT_BASE_URL} 系
16
+ 的域名」一律收口,换环境/换网关域名无需改这里——这正是「sy-base-url 管制」
17
+ 的字面语义。viaGateway 字段保留为可选的【额外】管制补充(如 OA MCP 后端),
18
+ 不影响 SYT_BASE_URL 自动判定。
19
+
20
+ 匹配语义(优先级从高到低):
21
+ 1. directAllow 命中(host/IP,精确或 *.domain 通配) → 直连放行
22
+ 2. host == SYT_BASE_URL 的 host(自动,不配置) → 仅网关可达(直连被墙)
23
+ 3. viaGateway 命中(可选的额外管制名单) → 仅网关可达
24
+ 4. 都不命中 → DROP / 网关 403
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import fnmatch
30
+ import socket
31
+ from typing import Optional
32
+ from urllib.parse import urlparse
33
+
34
+ from pydantic import BaseModel, Field
35
+
36
+ from sycommon.logging.kafka_log import SYLogger
37
+
38
+
39
+ class EgressPolicyConfig(BaseModel):
40
+ """沙箱出网策略(SYT_BASE_URL 同域名自动管制 / directAllow 直连 / 其余 DROP)。"""
41
+
42
+ viaGateway: list[str] = Field(
43
+ default_factory=list,
44
+ description=(
45
+ "【额外】强制走网关的目标 host(精确或 *.domain 通配),补充 SYT_BASE_URL "
46
+ "自动判定之外的管制对象。当前阶段:OA MCP 后端(ai.syitservice.com,含 "
47
+ "oa-workorder/xinghan/yealink/unlock/overtime/officesupplies/knowledge, "
48
+ "需 SYU-Token/SYU-Url 注入)。命中者直连被墙,只能经网关。"))
49
+ directAllow: list[str] = Field(
50
+ default_factory=list,
51
+ description=(
52
+ "直连放行的目标 host/IP(精确或 *.domain 通配)。不注入凭据。"
53
+ "显式豁免优先,包括豁免 SYT 管制。"))
54
+ defaultMode: str = Field(
55
+ default="allow",
56
+ description=(
57
+ "名单外 host 的默认处置: 'allow'=放行直连(当前阶段策略——只管制 "
58
+ "SYT_BASE_URL 同域名与 viaGateway 名单,其余外网全放行,用户自建技能"
59
+ "不受阻); 'drop'=DROP(未来收紧时改此值即可,不用改代码)。"))
60
+
61
+ # ---- 匹配 ----
62
+
63
+ @staticmethod
64
+ def _host_match(host: str, patterns: list[str]) -> bool:
65
+ """host 是否命中 patterns(精确或 fnmatch 通配,大小写不敏感)。"""
66
+ h = (host or "").lower()
67
+ for p in patterns:
68
+ p = (p or "").strip().lower()
69
+ if not p:
70
+ continue
71
+ if "*" in p or "?" in p:
72
+ if fnmatch.fnmatch(h, p):
73
+ return True
74
+ elif h == p:
75
+ return True
76
+ return False
77
+
78
+ def classify(self, host: str, syt_base_url: str = "") -> str:
79
+ """分类一个目标 host → 'direct' | 'gateway' | 'drop'。
80
+
81
+ 管制判定【自动】:host 与 syt_base_url(凭据包的真上游,主进程按环境
82
+ 解析)同 host → gateway。directAllow 优先于一切(显式豁免)。
83
+ viaGateway 为额外管制名单(当前阶段放 OA/星瀚后端)。
84
+
85
+ 名单外 defaultMode='allow' → direct(当前阶段:其余外网全放行);
86
+ 未来收紧改 'drop' 即名单外 DROP,不用改代码。
87
+ """
88
+ h = (host or "").lower().strip()
89
+ if not h:
90
+ return "drop"
91
+ # 1. directAllow 显式豁免优先
92
+ if self._host_match(h, self.directAllow):
93
+ return "direct"
94
+ # 2. SYT_BASE_URL 同域名 → 自动管制(核心语义,不配置)
95
+ syt_host = ""
96
+ try:
97
+ syt_host = (urlparse(syt_base_url or "").hostname or "").lower()
98
+ except Exception:
99
+ syt_host = ""
100
+ if syt_host and h == syt_host:
101
+ return "gateway"
102
+ # 3. 额外管制名单(OA/星瀚)
103
+ if self._host_match(h, self.viaGateway):
104
+ return "gateway"
105
+ # 4. 名单外:按 defaultMode(当前 allow=放行,可配置收紧为 drop)
106
+ return "drop" if (self.defaultMode or "").lower() == "drop" else "direct"
107
+
108
+ # ---- 供硬墙用:directAllow 解析成 IP(含端口) ----
109
+
110
+ def direct_targets(self) -> list[tuple[str, int]]:
111
+ """把 directAllow 条目解析成 (ip, port) 列表,供 iptables 放行。
112
+
113
+ 条目可以是 host、host:port、裸 IP。域名在此(沙箱进程)解析成 IP——
114
+ child 只放行解析后的 IP。解析失败跳过并告警(不阻断其它条目)。
115
+ 默认端口 443(host 无端口且是 https 语义)——为兼容 http 内网服务,
116
+ 无端口条目同时放行 80 与 443。
117
+ """
118
+ out: list[tuple[str, int]] = []
119
+ for raw in self.directAllow:
120
+ entry = (raw or "").strip()
121
+ if not entry:
122
+ continue
123
+ port = None
124
+ host = entry
125
+ if ":" in entry and not entry.count(":") > 1: # host:port(非 IPv6)
126
+ host, _, ps = entry.partition(":")
127
+ if ps.isdigit():
128
+ port = int(ps)
129
+ # 跳过通配符条目(硬墙按 IP 放行,通配域名无法枚举;告警提示)
130
+ if "*" in host or "?" in host:
131
+ SYLogger.warning(
132
+ f"[EgressPolicy] directAllow 含通配符 {entry},iptables 无法按 IP 放行,跳过(改用精确 host)")
133
+ continue
134
+ # host → IP(是 IP 则原样)
135
+ try:
136
+ socket.inet_aton(host)
137
+ ip = host
138
+ except OSError:
139
+ try:
140
+ ip = socket.gethostbyname(host)
141
+ except Exception as e:
142
+ SYLogger.warning(f"[EgressPolicy] 解析 {host} 失败,跳过: {e}")
143
+ continue
144
+ ports = [port] if port else [80, 443]
145
+ for p in ports:
146
+ if (ip, p) not in out:
147
+ out.append((ip, p))
148
+ return out
149
+
150
+ # ---- 供网关用:全部允许经网关的 host ----
151
+
152
+ def allowed_hosts(self, syt_base_url: str = "") -> list[str]:
153
+ """网关 host 白名单全集。
154
+
155
+ defaultMode='allow'(当前阶段)时返回 None 语义由调用方处理——名单外
156
+ 也放行(不设限);'drop' 模式下才用集合判定。这里恒返回集合供 'drop'
157
+ 模式与审计使用:directAllow + viaGateway + SYT host。
158
+ """
159
+ hosts = list(self.directAllow) + list(self.viaGateway)
160
+ try:
161
+ syt_host = (urlparse(syt_base_url or "").hostname or "").lower()
162
+ if syt_host:
163
+ hosts.append(syt_host)
164
+ except Exception:
165
+ pass
166
+ return list(dict.fromkeys(h for h in hosts if h))
167
+
168
+ # ---- 加载 ----
169
+
170
+ @classmethod
171
+ def from_config(cls) -> "EgressPolicyConfig":
172
+ """从沙箱自身 dataId(shengye-platform-sandbox)读 EgressPolicy 段。
173
+
174
+ 项目 dataId 顶层 key 已全量提升(Config.set_attr),无需登记。
175
+ 未配置 → 空策略(SYT_BASE_URL 同域名仍自动管制,其余 DROP)。
176
+ """
177
+ from sycommon.config.Config import Config
178
+ raw = Config().config.get("EgressPolicy") or {}
179
+ try:
180
+ return cls(**raw) if isinstance(raw, dict) else cls()
181
+ except Exception as e:
182
+ SYLogger.warning(f"[EgressPolicy] 配置解析失败,按空策略处理: {e}")
183
+ return cls()
@@ -0,0 +1,268 @@
1
+ """沙箱出网收口硬墙:iptables OUTPUT 白名单(按 child uid owner-match)。
2
+
3
+ 在沙箱服务进程(root,有 CAP_NET_ADMIN)启动时、网关 listener 起来之后调用
4
+ setup_egress_wall(),配置 OUTPUT 链规则,把 child 子进程(降权到 CHILD_DROP_UID)
5
+ 的出网限制为:
6
+
7
+ 1. 本机网关 host:port(${SYT_BASE_URL} 指向它,SYT/OA 流量强制经网关受管制)
8
+ 2. DNS(udp/tcp 53,child 要解析域名)
9
+ 3. EgressPolicy.directAllow 的目标(内网无鉴权服务/公网查询类,直连不受影响)
10
+ 4. 其余全部 DROP(防数据外泄——node/Go/裸socket/任意静态二进制绕不过)
11
+
12
+ EgressPolicy 来自沙箱自己的 Nacos dataId(shengye-platform-sandbox)的
13
+ EgressPolicy 段(见 sycommon/config/EgressPolicyConfig.py),Nacos 热更新后
14
+ 调 refresh_egress_wall() 重配。
15
+
16
+ 这是 L3/L4 内核级硬墙,语言无关、绕不过——比应用层 hook(sitecustomize/
17
+ LD_PRELOAD/HTTPS_PROXY)强且无盲区。
18
+
19
+ 设计要点:
20
+ - owner-match(-m owner --uid-owner):只锁 child uid,沙箱服务进程(root/其它 uid)
21
+ 连 Nacos/Redis/MinIO 不受影响。避免「全容器 DROP 把服务自己搞挂」。
22
+ - 幂等:规则带 _RULE_COMMENT 标记,重配前先清理旧规则,不累积。
23
+ - 降级:无 CAP_NET_ADMIN / iptables 不存在 / 非 Linux → 跳过并告警,不阻断启动
24
+ (此时无硬墙,凭据隔离仍是主防线,但 node 等盲区未堵,日志明确提示)。
25
+
26
+ 依赖:
27
+ - 容器有 CAP_NET_ADMIN(K8s securityContext.capabilities.add: [NET_ADMIN])
28
+ - 镜像装了 iptables(Dockerfile: apt-get install iptables)
29
+ - child 降权到 CHILD_DROP_UID(sandbox.py _preexec_drop_privileges)
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import asyncio
35
+ import os
36
+ import platform
37
+ import shlex
38
+ import subprocess
39
+ from typing import Optional
40
+
41
+ from sycommon.logging.kafka_log import SYLogger
42
+
43
+
44
+ # iptables 规则链上的注释标记,用于幂等识别/清理本模块加的规则。
45
+ _RULE_COMMENT = "sycommon-egress-wall"
46
+
47
+
48
+ def _read_dns_ips() -> list[str]:
49
+ """从 /etc/resolv.conf 读 nameserver IP(去重)。child 要能解析域名。"""
50
+ ips: list[str] = []
51
+ try:
52
+ with open("/etc/resolv.conf") as f:
53
+ for line in f:
54
+ line = line.strip()
55
+ if line.lower().startswith("nameserver"):
56
+ parts = line.split()
57
+ if len(parts) >= 2 and parts[1] not in ips:
58
+ ips.append(parts[1])
59
+ except Exception as e:
60
+ SYLogger.warning(f"[EgressWall] 读 /etc/resolv.conf 失败: {e}")
61
+ return ips
62
+
63
+
64
+ def _have_net_admin() -> bool:
65
+ """实测当前进程能否配 iptables(有 CAP_NET_ADMIN)。"""
66
+ if platform.system() != "Linux":
67
+ return False
68
+ try:
69
+ r = subprocess.run(
70
+ ["iptables", "-t", "nat", "-L"],
71
+ capture_output=True, timeout=5,
72
+ )
73
+ return r.returncode == 0
74
+ except Exception:
75
+ return False
76
+
77
+
78
+ def _run_iptables(args: list[str]) -> tuple[int, str]:
79
+ """跑一条 iptables 命令,返回 (returncode, stderr)。"""
80
+ try:
81
+ r = subprocess.run(["iptables", *args], capture_output=True, timeout=10)
82
+ return r.returncode, (r.stderr.decode(errors="replace").strip())
83
+ except Exception as e:
84
+ return 1, str(e)
85
+
86
+
87
+ def _clear_old_rules(child_uid: int) -> None:
88
+ """幂等清理本模块之前加的 OUTPUT 规则(按注释标记匹配)。
89
+
90
+ iptables 无「按注释批量删」的原子操作,这里用 -S 列出 OUTPUT 规则,
91
+ 逐条匹配含 _RULE_COMMENT 的,-D 删除。重复 setup 不累积规则。
92
+ """
93
+ try:
94
+ r = subprocess.run(["iptables", "-S", "OUTPUT"], capture_output=True, timeout=10)
95
+ if r.returncode != 0:
96
+ return
97
+ lines = r.stdout.decode(errors="replace").splitlines()
98
+ for line in lines:
99
+ if _RULE_COMMENT in line:
100
+ # line 形如 "-A OUTPUT -m owner ... -j DROP -m comment --comment sycommon-egress-wall"
101
+ # 把 -A 换成 -D 即可删除该条。
102
+ del_spec = line.replace("-A OUTPUT", "OUTPUT", 1).strip()
103
+ # 去掉行首可能的 "-A"
104
+ _run_iptables(["-D"] + shlex.split(del_spec))
105
+ except Exception as e:
106
+ SYLogger.debug(f"[EgressWall] 清理旧规则异常(非致命): {e}")
107
+
108
+
109
+ def setup_egress_wall(child_uid: int, gateway_port: int,
110
+ gateway_host: str = "127.0.0.1",
111
+ direct_targets: Optional[list] = None,
112
+ drop_fallback: bool = True) -> bool:
113
+ """配置 child uid 的出网硬墙。返回是否成功。
114
+
115
+ 规则(按顺序,owner-match 只锁 child uid):
116
+ 1. ESTABLISHED,RELATED 放行(回包)
117
+ 2. DNS(udp/tcp 53)放行——按 /etc/resolv.conf 的 nameserver
118
+ 3. 连本机网关 host:port 放行
119
+ 4. direct_targets [(ip, port), ...] 放行(EgressPolicy.directAllow 解析产物,
120
+ 内网无鉴权服务/公网查询类直连)
121
+ 5. drop_fallback=True 时:其余 child uid 出网全 DROP。
122
+ 当前阶段 EgressPolicy.defaultMode='allow'(只管制 SYT/OA 域,其余放行)
123
+ → drop_fallback=False,墙只保障「管制 host 直连被挡、必须走网关」,
124
+ 不做兜底 DROP。未来收紧 defaultMode='drop' 时自动启用兜底。
125
+
126
+ 管制 host(SYT_BASE_URL 同域名/viaGateway)不在放行之列——它们直连被墙,
127
+ 只能经网关(网关注入凭据+审计),这正是「sy-base-url 管制」的硬墙侧执行。
128
+ 要解析「管制域名的 IP 并精确 DROP」需 ipset+定时解析(域名 IP 会漂移),
129
+ 当前简化:defaultMode=allow 时墙退化为「网关保障」模式(不 DROP 兜底),
130
+ 管制由【库层 URL 重写+网关凭据注入】承担——凭据只有网关有,直连即使
131
+ 通了也无凭据可用。
132
+
133
+ 幂等:先清理本模块旧规则,再追加。非 Linux / 无 NET_ADMIN / iptables 缺失 → 跳过+告警。
134
+ """
135
+ if platform.system() != "Linux":
136
+ SYLogger.info("[EgressWall] 非 Linux,跳过 iptables 硬墙")
137
+ return False
138
+ if not _have_net_admin():
139
+ SYLogger.warning(
140
+ "[EgressWall] 无 CAP_NET_ADMIN 或无 iptables,跳过硬墙配置。"
141
+ "此时无内核级出网限制,node/裸 socket 盲区未堵——请给沙箱 Pod 加 "
142
+ "securityContext.capabilities.add:[NET_ADMIN] 并在镜像装 iptables。")
143
+ return False
144
+ if not gateway_port:
145
+ SYLogger.warning("[EgressWall] 网关端口未知,跳过硬墙配置")
146
+ return False
147
+
148
+ dns_ips = _read_dns_ips()
149
+ direct_targets = direct_targets or []
150
+
151
+ _clear_old_rules(child_uid)
152
+
153
+ uid = str(child_uid)
154
+ c = lambda spec: ["-m", "comment", "--comment", _RULE_COMMENT, *spec] # noqa: E731
155
+
156
+ # 1. ESTABLISHED,RELATED(回包)
157
+ _run_iptables(["-A", "OUTPUT", "-m", "owner", "--uid-owner", uid,
158
+ "-m", "conntrack", "--ctstate", "ESTABLISHED,RELATED",
159
+ "-m", "comment", "--comment", _RULE_COMMENT, "-j", "ACCEPT"])
160
+
161
+ # 2. DNS(每个 nameserver,udp + tcp 53)
162
+ for ip in dns_ips:
163
+ _run_iptables(["-A", "OUTPUT", "-m", "owner", "--uid-owner", uid,
164
+ "-p", "udp", "-d", ip, "--dport", "53",
165
+ "-m", "comment", "--comment", _RULE_COMMENT, "-j", "ACCEPT"])
166
+ _run_iptables(["-A", "OUTPUT", "-m", "owner", "--uid-owner", uid,
167
+ "-p", "tcp", "-d", ip, "--dport", "53",
168
+ "-m", "comment", "--comment", _RULE_COMMENT, "-j", "ACCEPT"])
169
+
170
+ # 3. 本机网关
171
+ gw_rc, gw_err = _run_iptables(
172
+ ["-A", "OUTPUT", "-m", "owner", "--uid-owner", uid,
173
+ "-p", "tcp", "-d", gateway_host, "--dport", str(gateway_port),
174
+ "-m", "comment", "--comment", _RULE_COMMENT, "-j", "ACCEPT"])
175
+ if gw_rc != 0:
176
+ SYLogger.warning(f"[EgressWall] 放行网关规则失败: {gw_err}")
177
+
178
+ # 4. directAllow 直连放行(EgressPolicy.directAllow 解析出的 (ip, port))
179
+ direct_ok = 0
180
+ for ip, port in direct_targets:
181
+ rc, err = _run_iptables(
182
+ ["-A", "OUTPUT", "-m", "owner", "--uid-owner", uid,
183
+ "-p", "tcp", "-d", ip, "--dport", str(port),
184
+ "-m", "comment", "--comment", _RULE_COMMENT, "-j", "ACCEPT"])
185
+ if rc == 0:
186
+ direct_ok += 1
187
+ else:
188
+ SYLogger.warning(f"[EgressWall] directAllow 放行失败 {ip}:{port}: {err}")
189
+
190
+ # 5. 兜底 DROP(defaultMode='drop' 时;当前阶段 allow 不加,其余外网放行)
191
+ if drop_fallback:
192
+ drop_rc, drop_err = _run_iptables(
193
+ ["-A", "OUTPUT", "-m", "owner", "--uid-owner", uid,
194
+ "-m", "comment", "--comment", _RULE_COMMENT, "-j", "DROP"])
195
+ if drop_rc != 0:
196
+ SYLogger.warning(f"[EgressWall] DROP 规则失败: {drop_err}")
197
+ return False
198
+ fallback_desc = "其余 DROP"
199
+ else:
200
+ fallback_desc = "其余放行(defaultMode=allow)"
201
+
202
+ SYLogger.info(
203
+ f"[EgressWall] 硬墙已配置: child uid={child_uid}, "
204
+ f"放行网关 {gateway_host}:{gateway_port} + DNS({dns_ips}) + "
205
+ f"directAllow({direct_ok} 条), {fallback_desc}")
206
+ return True
207
+
208
+
209
+ def teardown_egress_wall(child_uid: int) -> None:
210
+ """关闭时清理本模块规则。"""
211
+ if platform.system() != "Linux":
212
+ return
213
+ try:
214
+ _clear_old_rules(child_uid)
215
+ SYLogger.info(f"[EgressWall] 已清理硬墙规则: child uid={child_uid}")
216
+ except Exception as e:
217
+ SYLogger.debug(f"[EgressWall] 清理规则异常: {e}")
218
+
219
+
220
+ # ============== 供 services.py lifespan 调用的高层封装 ==============
221
+
222
+ _egress_wall_installed = False
223
+ _gateway_port_cache: int = 0
224
+ _gateway_host_cache: str = "127.0.0.1"
225
+
226
+
227
+ async def setup_egress_wall_async(child_uid: int, gateway_port: int,
228
+ gateway_host: str = "127.0.0.1") -> bool:
229
+ """异步包装:在线程池跑 iptables(subprocess 阻塞),不卡事件循环。
230
+
231
+ 自动读沙箱 dataId 的 EgressPolicy:directAllow 并入放行列表;
232
+ defaultMode 决定是否启用兜底 DROP('drop' 才加,'allow' 只保障网关通道)。
233
+ """
234
+ global _egress_wall_installed, _gateway_port_cache, _gateway_host_cache
235
+ _gateway_port_cache = gateway_port
236
+ _gateway_host_cache = gateway_host
237
+ direct, drop_fb = await asyncio.to_thread(_policy_wall_params)
238
+ ok = await asyncio.to_thread(
239
+ setup_egress_wall, child_uid, gateway_port, gateway_host, direct, drop_fb)
240
+ _egress_wall_installed = ok
241
+ return ok
242
+
243
+
244
+ def _policy_wall_params() -> tuple:
245
+ """读 EgressPolicy → (direct_targets, drop_fallback)(沙箱本地 Config)。"""
246
+ try:
247
+ from sycommon.config.EgressPolicyConfig import EgressPolicyConfig
248
+ policy = EgressPolicyConfig.from_config()
249
+ return (policy.direct_targets(),
250
+ (policy.defaultMode or "allow").lower() == "drop")
251
+ except Exception as e:
252
+ SYLogger.warning(f"[EgressWall] 读 EgressPolicy 失败(仅网关+DNS 放行): {e}")
253
+ return ([], False)
254
+
255
+
256
+ async def refresh_egress_wall_async(child_uid: int) -> bool:
257
+ """Nacos EgressPolicy 热更新后重配硬墙(幂等:清理旧规则再加)。"""
258
+ if not _gateway_port_cache:
259
+ SYLogger.warning("[EgressWall] 网关未启动,跳过刷新")
260
+ return False
261
+ return await setup_egress_wall_async(
262
+ child_uid, _gateway_port_cache, _gateway_host_cache)
263
+
264
+
265
+ async def teardown_egress_wall_async(child_uid: int) -> None:
266
+ global _egress_wall_installed
267
+ await asyncio.to_thread(teardown_egress_wall, child_uid)
268
+ _egress_wall_installed = False