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.
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/pyproject.toml +1 -1
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/deep_agent.py +0 -15
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/egress_wall.py +2 -2
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/sandbox.py +14 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/sandbox_gateway.py +36 -11
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -4
- sycommon_python_lib-0.2.8a4/src/sycommon/agent/middleware/sitecustomize.py +0 -300
- sycommon_python_lib-0.2.8a4/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -479
- sycommon_python_lib-0.2.8a4/src/sycommon/agent/middleware/skill_wl_check.py +0 -123
- sycommon_python_lib-0.2.8a4/src/sycommon/config/SkillApiWhitelistConfig.py +0 -87
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/README.md +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/middleware/model_request_prep.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/reasoning_content_patch.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/resume_compactor.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/EgressPolicyConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_backend_factory_compat.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consume_dedup.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consumer_recovery_fix.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_consumer_tags_sync.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_env_tenant_helper.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_fault_injection_real.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_heartbeat_timeout.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_integration_real_broker.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_mq_config_driven.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_nacos_llm_real.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_reconnect_scenarios.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tests/test_upgrade_verification.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/time_utils.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/tools/user_id.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_streaming_e2e.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_sync_skills_to_sandbox.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_time_utils.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_upload_concurrency.py +0 -0
- {sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/tests/test_upload_e2e_http.py +0 -0
{sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/agent/deep_agent.py
RENAMED
|
@@ -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],
|
{sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/egress_wall.py
RENAMED
|
@@ -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
|
|
17
|
-
LD_PRELOAD
|
|
16
|
+
这是 L3/L4 内核级硬墙,语言无关、绕不过——比旧应用层 hook(已删的
|
|
17
|
+
monkeypatch/LD_PRELOAD 等)强且无盲区。
|
|
18
18
|
|
|
19
19
|
设计要点:
|
|
20
20
|
- owner-match(-m owner --uid-owner):只锁 child uid,沙箱服务进程(root/其它 uid)
|
{sycommon_python_lib-0.2.8a4 → sycommon_python_lib-0.2.8a6}/src/sycommon/middleware/sandbox.py
RENAMED
|
@@ -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.
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
"""
|
|
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,免鉴权,打穿即跨用户任意执行)
|
|
416
|
-
#
|
|
417
|
-
|
|
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
|
|
@@ -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)
|