sycommon-python-lib 0.2.7a18__tar.gz → 0.2.7a19__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.7a18 → sycommon_python_lib-0.2.7a19}/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/pyproject.toml +1 -1
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/middleware/sandbox_path_guard.py +35 -18
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/multi_agent_team.py +3 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
- sycommon_python_lib-0.2.7a19/tests/test_sandbox_path_guard.py +297 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/README.md +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/tests/test_sync_skills_to_sandbox.py +0 -0
|
@@ -44,8 +44,10 @@ except Exception: # 测试/独立引入环境兜底,行为与 sandbox.py 保持
|
|
|
44
44
|
_WORKSPACE_ROOT = os.path.realpath(WORKSPACE_BASE).rstrip(os.sep)
|
|
45
45
|
|
|
46
46
|
|
|
47
|
-
# 工具 →
|
|
48
|
-
# get_share_url 是 app(base_tools)
|
|
47
|
+
# 工具 → 路径字段名(单字段)或多字段(列表)映射(结构化参数,可安全改写/拦截)。
|
|
48
|
+
# get_share_url 是 app(base_tools)自定义工具,吃 file_path;
|
|
49
|
+
# transfer_file 是 bridge/multi 模式注入的跨沙箱传输工具,吃 src_path + dst_path,
|
|
50
|
+
# 两个路径字段都要过同一套越权校验(否则 agent 可借它绕过,把别人的绝对路径文件传出来)。
|
|
49
51
|
_PATH_TOOLS = {
|
|
50
52
|
"read_file": "file_path",
|
|
51
53
|
"write_file": "file_path",
|
|
@@ -54,6 +56,7 @@ _PATH_TOOLS = {
|
|
|
54
56
|
"glob": "path",
|
|
55
57
|
"grep": "path",
|
|
56
58
|
"get_share_url": "file_path",
|
|
59
|
+
"transfer_file": ["src_path", "dst_path"],
|
|
57
60
|
}
|
|
58
61
|
|
|
59
62
|
# 宿主沙箱根前缀(用于 execute 命令串扫描;shell 里无法安全改写,只能拦)。
|
|
@@ -114,22 +117,36 @@ class SandboxPathGuardMiddleware(AgentMiddleware):
|
|
|
114
117
|
if not isinstance(args, dict):
|
|
115
118
|
return await handler(request)
|
|
116
119
|
|
|
117
|
-
# 1) 结构化路径工具:read/write/edit/ls/grep/glob/get_share_url
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
120
|
+
# 1) 结构化路径工具:read/write/edit/ls/grep/glob/get_share_url/transfer_file
|
|
121
|
+
# 字段规格可为单字段(str)或多字段(list);多字段工具(如 transfer_file
|
|
122
|
+
# 的 src_path+dst_path)任一字段越界即拦整个调用,防借传输绕过读他人文件。
|
|
123
|
+
fields_spec = _PATH_TOOLS.get(name)
|
|
124
|
+
if fields_spec:
|
|
125
|
+
fields = [fields_spec] if isinstance(fields_spec, str) else list(fields_spec)
|
|
126
|
+
rewrites = {} # field -> 改写后的虚拟路径
|
|
127
|
+
for field in fields:
|
|
128
|
+
raw = args.get(field)
|
|
129
|
+
if not isinstance(raw, str):
|
|
130
|
+
continue
|
|
131
|
+
# transfer_file 支持 sandbox:<名称>: 前缀指定源/目标沙箱,剥掉前缀再判路径本身
|
|
132
|
+
path_part = raw.split(":", 2)[-1] if raw.startswith("sandbox:") else raw
|
|
133
|
+
if not _is_host_absolute(path_part):
|
|
134
|
+
continue
|
|
135
|
+
if self._self_ws and _within_self_workspace(path_part, self._self_ws):
|
|
136
|
+
# 自己工作目录内的绝对路径 → 改写为虚拟路径(剥前缀后改写,前缀保留)
|
|
137
|
+
virtual = _to_virtual(path_part, self._self_ws)
|
|
138
|
+
rewrites[field] = (raw[:len(raw) - len(path_part)] + virtual) \
|
|
139
|
+
if raw.startswith("sandbox:") else virtual
|
|
140
|
+
else:
|
|
141
|
+
# 越界/跨用户宿主绝对路径 → 整个调用拦
|
|
142
|
+
return ToolMessage(content=_DENIED_MSG, name=name,
|
|
143
|
+
tool_call_id=tc.get("id", ""), status="error")
|
|
144
|
+
if rewrites:
|
|
145
|
+
new_args = dict(args)
|
|
146
|
+
new_args.update(rewrites)
|
|
147
|
+
new_tc = dict(tc)
|
|
148
|
+
new_tc["args"] = new_args
|
|
149
|
+
return await handler(dataclasses.replace(request, tool_call=new_tc))
|
|
133
150
|
return await handler(request)
|
|
134
151
|
|
|
135
152
|
# 2) execute(裸 shell):命令串里的宿主绝对路径无法安全改写,只能拦
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycommon/agent/multi_agent_team.py
RENAMED
|
@@ -46,6 +46,7 @@ from sycommon.agent.chat_events import ChatEvent, ChatEventBuilder, DEFAULT_AGEN
|
|
|
46
46
|
from sycommon.middleware.token_tracking import TokenTrackingMiddleware
|
|
47
47
|
from sycommon.middleware.tool_result_truncation import ToolResultTruncationMiddleware
|
|
48
48
|
from sycommon.agent.middleware.skill_write_guard import SkillWriteGuardMiddleware
|
|
49
|
+
from sycommon.agent.middleware.sandbox_path_guard import SandboxPathGuardMiddleware
|
|
49
50
|
from sycommon.agent.middleware.sensitive_guard import (
|
|
50
51
|
SensitiveGuardMiddleware, DowngradeState,
|
|
51
52
|
)
|
|
@@ -643,6 +644,7 @@ async def create_multi_agent_team(
|
|
|
643
644
|
TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
|
|
644
645
|
summarization_mw,
|
|
645
646
|
SkillWriteGuardMiddleware(),
|
|
647
|
+
SandboxPathGuardMiddleware(user_id),
|
|
646
648
|
]
|
|
647
649
|
shared = config.shared_tools or [get_current_date]
|
|
648
650
|
|
|
@@ -701,6 +703,7 @@ async def create_multi_agent_team(
|
|
|
701
703
|
TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
|
|
702
704
|
coord_summarization_mw,
|
|
703
705
|
SkillWriteGuardMiddleware(),
|
|
706
|
+
SandboxPathGuardMiddleware(user_id),
|
|
704
707
|
],
|
|
705
708
|
)
|
|
706
709
|
|
|
@@ -323,6 +323,7 @@ tests/test_hotreload_snapshot.py
|
|
|
323
323
|
tests/test_llm_apikey_contextvar.py
|
|
324
324
|
tests/test_log_masker.py
|
|
325
325
|
tests/test_resilient_pg_saver.py
|
|
326
|
+
tests/test_sandbox_path_guard.py
|
|
326
327
|
tests/test_sensitive_guard.py
|
|
327
328
|
tests/test_simple_chat_agent.py
|
|
328
329
|
tests/test_skill_regex_upgrade.py
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"""SandboxPathGuardMiddleware: 规范化/拦截沙箱工具调用里的宿主绝对路径。
|
|
2
|
+
|
|
3
|
+
不实例化沙箱,纯逻辑测 awrap_tool_call:构造假 request + handler,断言三态
|
|
4
|
+
(拦截返回 error ToolMessage / 改写 args 后放行 / 原样放行)。
|
|
5
|
+
|
|
6
|
+
测试用 tmp_path 作 WORKSPACE_BASE,避免依赖产线 /data/sycommon_sandbox。
|
|
7
|
+
通过 monkeypatch 替换模块级 _WORKSPACE_ROOT / WORKSPACE_BASE / _HOST_SANDBOX_RE,
|
|
8
|
+
保证「middleware 算的前缀」就是测试构造的临时根。
|
|
9
|
+
"""
|
|
10
|
+
import os
|
|
11
|
+
import re
|
|
12
|
+
import sys
|
|
13
|
+
|
|
14
|
+
import pytest
|
|
15
|
+
from langgraph.prebuilt.tool_node import ToolCallRequest
|
|
16
|
+
|
|
17
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
|
|
18
|
+
|
|
19
|
+
from sycommon.agent.middleware import sandbox_path_guard as spg
|
|
20
|
+
from sycommon.agent.middleware.sandbox_path_guard import (
|
|
21
|
+
SandboxPathGuardMiddleware, _is_host_absolute, _within_self_workspace,
|
|
22
|
+
_to_virtual, _sanitize_user_id,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# ============== fixtures: 把工作根钉到 tmp_path ==============
|
|
27
|
+
|
|
28
|
+
@pytest.fixture
|
|
29
|
+
def workspace(tmp_path, monkeypatch):
|
|
30
|
+
"""用一个真实临时目录作 WORKSPACE_BASE,并重算模块级锚点。
|
|
31
|
+
|
|
32
|
+
_WORKSPACE_ROOT 是模块加载时 realpath 算出的,测试必须 monkeypatch 它,
|
|
33
|
+
否则 _is_host_absolute 会按真实沙箱根(/data/sycommon_sandbox 或 tempdir)判,
|
|
34
|
+
与测试构造的路径对不上。
|
|
35
|
+
"""
|
|
36
|
+
root = os.path.realpath(str(tmp_path)).rstrip(os.sep)
|
|
37
|
+
monkeypatch.setattr(spg, "WORKSPACE_BASE", root)
|
|
38
|
+
monkeypatch.setattr(spg, "_WORKSPACE_ROOT", root)
|
|
39
|
+
monkeypatch.setattr(spg, "_HOST_SANDBOX_RE",
|
|
40
|
+
re.compile(re.escape(root) + r'(?:/|\\)'))
|
|
41
|
+
return root
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _self_ws(workspace, user="osulcode.xiao"):
|
|
45
|
+
return os.path.join(workspace, _sanitize_user_id(user))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _req(name, args):
|
|
49
|
+
call = {"name": name, "args": args, "id": "call_1", "type": "tool_call"}
|
|
50
|
+
return ToolCallRequest(tool_call=call, tool=None, state={}, runtime=None)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# ============== 纯函数 ==============
|
|
54
|
+
|
|
55
|
+
def test_is_host_absolute_virtual_relative_false(workspace):
|
|
56
|
+
assert not _is_host_absolute("/skills/system/x/SKILL.md")
|
|
57
|
+
assert not _is_host_absolute("./output/report.pdf")
|
|
58
|
+
assert not _is_host_absolute("result.xlsx")
|
|
59
|
+
assert not _is_host_absolute("")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_is_host_absolute_root_outside_false(workspace):
|
|
63
|
+
# 沙箱根之外的宿主路径不算(沙箱里本就读不到,留给服务端 not found)
|
|
64
|
+
assert not _is_host_absolute("/etc/passwd")
|
|
65
|
+
assert not _is_host_absolute("/tmp/anything")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_is_host_absolute_within_root_true(workspace):
|
|
69
|
+
p = os.path.join(workspace, "osulcode.xiao", "skills", "x.py")
|
|
70
|
+
assert _is_host_absolute(p)
|
|
71
|
+
assert _is_host_absolute(workspace) # 根本身
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def test_within_self_workspace(workspace):
|
|
75
|
+
self_ws = _self_ws(workspace)
|
|
76
|
+
mine = os.path.join(self_ws, "skills", "a.py")
|
|
77
|
+
other = os.path.join(workspace, "gary.liu", "skills", "a.py")
|
|
78
|
+
assert _within_self_workspace(mine, self_ws)
|
|
79
|
+
assert not _within_self_workspace(other, self_ws)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def test_to_virtual(workspace):
|
|
83
|
+
self_ws = _self_ws(workspace)
|
|
84
|
+
p = os.path.join(self_ws, "skills", "system", "x", "SKILL.md")
|
|
85
|
+
assert _to_virtual(p, self_ws) == "/skills/system/x/SKILL.md"
|
|
86
|
+
assert _to_virtual(self_ws, self_ws) == "/" # 工作目录根
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_to_virtual_posix_separators(workspace):
|
|
90
|
+
r"""虚拟路径必须用 / 分隔,不出现反斜杠。"""
|
|
91
|
+
self_ws = _self_ws(workspace)
|
|
92
|
+
p = os.path.join(self_ws, "output", "report.pdf")
|
|
93
|
+
v = _to_virtual(p, self_ws)
|
|
94
|
+
assert "\\" not in v
|
|
95
|
+
assert v == "/output/report.pdf"
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
# ============== awrap_tool_call: read_file ==============
|
|
99
|
+
|
|
100
|
+
@pytest.mark.asyncio
|
|
101
|
+
async def test_read_file_virtual_passthrough(workspace):
|
|
102
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
103
|
+
|
|
104
|
+
async def handler(req):
|
|
105
|
+
return "REACHED"
|
|
106
|
+
|
|
107
|
+
res = await mw.awrap_tool_call(
|
|
108
|
+
_req("read_file", {"file_path": "/skills/system/x/SKILL.md"}), handler)
|
|
109
|
+
assert res == "REACHED"
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@pytest.mark.asyncio
|
|
113
|
+
async def test_read_file_self_abs_path_rewritten(workspace):
|
|
114
|
+
"""自己工作目录的宿主绝对路径 → 改写为虚拟路径,放行。"""
|
|
115
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
116
|
+
self_ws = _self_ws(workspace)
|
|
117
|
+
abs_path = os.path.join(self_ws, "skills", "system", "x", "SKILL.md")
|
|
118
|
+
seen = {}
|
|
119
|
+
|
|
120
|
+
async def handler(req):
|
|
121
|
+
seen["args"] = req.tool_call["args"]
|
|
122
|
+
return "REACHED"
|
|
123
|
+
|
|
124
|
+
res = await mw.awrap_tool_call(
|
|
125
|
+
_req("read_file", {"file_path": abs_path}), handler)
|
|
126
|
+
assert res == "REACHED"
|
|
127
|
+
assert seen["args"]["file_path"] == "/skills/system/x/SKILL.md"
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@pytest.mark.asyncio
|
|
131
|
+
async def test_read_file_cross_user_abs_path_denied(workspace):
|
|
132
|
+
"""别人的工作目录宿主绝对路径 → 拦截。"""
|
|
133
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
134
|
+
other = os.path.join(workspace, "gary.liu", "skills", "x", "SKILL.md")
|
|
135
|
+
called = {"n": 0}
|
|
136
|
+
|
|
137
|
+
async def handler(req):
|
|
138
|
+
called["n"] += 1
|
|
139
|
+
return "REACHED"
|
|
140
|
+
|
|
141
|
+
res = await mw.awrap_tool_call(_req("read_file", {"file_path": other}), handler)
|
|
142
|
+
assert called["n"] == 0
|
|
143
|
+
assert res.status == "error"
|
|
144
|
+
assert "宿主机绝对路径" in str(res.content)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# ============== awrap_tool_call: transfer_file(多字段) ==============
|
|
148
|
+
|
|
149
|
+
@pytest.mark.asyncio
|
|
150
|
+
async def test_transfer_file_both_relative_passthrough(workspace):
|
|
151
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
152
|
+
|
|
153
|
+
async def handler(req):
|
|
154
|
+
return "REACHED"
|
|
155
|
+
|
|
156
|
+
res = await mw.awrap_tool_call(
|
|
157
|
+
_req("transfer_file", {"src_path": "./a.py", "dst_path": "./b.py",
|
|
158
|
+
"direction": "any"}), handler)
|
|
159
|
+
assert res == "REACHED"
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
@pytest.mark.asyncio
|
|
163
|
+
async def test_transfer_file_src_self_rewritten(workspace):
|
|
164
|
+
"""src 是自己工作目录绝对路径 → 改写 src,放行。"""
|
|
165
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
166
|
+
self_ws = _self_ws(workspace)
|
|
167
|
+
src_abs = os.path.join(self_ws, "data.csv")
|
|
168
|
+
seen = {}
|
|
169
|
+
|
|
170
|
+
async def handler(req):
|
|
171
|
+
seen["args"] = req.tool_call["args"]
|
|
172
|
+
return "REACHED"
|
|
173
|
+
|
|
174
|
+
await mw.awrap_tool_call(
|
|
175
|
+
_req("transfer_file", {"src_path": src_abs, "dst_path": "./out.csv",
|
|
176
|
+
"direction": "any"}), handler)
|
|
177
|
+
assert seen["args"]["src_path"] == "/data.csv"
|
|
178
|
+
assert seen["args"]["dst_path"] == "./out.csv" # dst 未改
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@pytest.mark.asyncio
|
|
182
|
+
async def test_transfer_file_dst_cross_user_denied(workspace):
|
|
183
|
+
"""dst 指向别人的工作目录 → 整个调用拦截(防往别人目录写)。"""
|
|
184
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
185
|
+
other = os.path.join(workspace, "gary.liu", "out.csv")
|
|
186
|
+
called = {"n": 0}
|
|
187
|
+
|
|
188
|
+
async def handler(req):
|
|
189
|
+
called["n"] += 1
|
|
190
|
+
return "REACHED"
|
|
191
|
+
|
|
192
|
+
res = await mw.awrap_tool_call(
|
|
193
|
+
_req("transfer_file", {"src_path": "./a.py", "dst_path": other,
|
|
194
|
+
"direction": "any"}), handler)
|
|
195
|
+
assert called["n"] == 0
|
|
196
|
+
assert res.status == "error"
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
@pytest.mark.asyncio
|
|
200
|
+
async def test_transfer_file_src_cross_user_denied(workspace):
|
|
201
|
+
"""src 是别人的工作目录 → 拦截(防借传输读他人文件)。"""
|
|
202
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
203
|
+
other = os.path.join(workspace, "gary.liu", "secret.csv")
|
|
204
|
+
called = {"n": 0}
|
|
205
|
+
|
|
206
|
+
async def handler(req):
|
|
207
|
+
called["n"] += 1
|
|
208
|
+
return "REACHED"
|
|
209
|
+
|
|
210
|
+
res = await mw.awrap_tool_call(
|
|
211
|
+
_req("transfer_file", {"src_path": other, "dst_path": "./out.csv",
|
|
212
|
+
"direction": "any"}), handler)
|
|
213
|
+
assert called["n"] == 0
|
|
214
|
+
assert res.status == "error"
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
@pytest.mark.asyncio
|
|
218
|
+
async def test_transfer_file_sandbox_prefix_self_rewritten(workspace):
|
|
219
|
+
"""sandbox:<名称>: 前缀 + 自己工作目录路径 → 剥前缀判,改写时保留前缀。"""
|
|
220
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
221
|
+
self_ws = _self_ws(workspace)
|
|
222
|
+
src_abs = os.path.join(self_ws, "data.csv")
|
|
223
|
+
seen = {}
|
|
224
|
+
|
|
225
|
+
async def handler(req):
|
|
226
|
+
seen["args"] = req.tool_call["args"]
|
|
227
|
+
return "REACHED"
|
|
228
|
+
|
|
229
|
+
await mw.awrap_tool_call(
|
|
230
|
+
_req("transfer_file", {"src_path": f"sandbox:MacBook-Pro:{src_abs}",
|
|
231
|
+
"dst_path": "./out.csv", "direction": "any"}), handler)
|
|
232
|
+
assert seen["args"]["src_path"] == f"sandbox:MacBook-Pro:/data.csv"
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
# ============== awrap_tool_call: execute ==============
|
|
236
|
+
|
|
237
|
+
@pytest.mark.asyncio
|
|
238
|
+
async def test_execute_host_abs_path_denied(workspace):
|
|
239
|
+
"""execute 命令串含宿主沙箱路径 → 拦(无法安全改写)。"""
|
|
240
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
241
|
+
self_ws = _self_ws(workspace)
|
|
242
|
+
cmd = f"cat {os.path.join(self_ws, 'skills', 'x.py')}"
|
|
243
|
+
called = {"n": 0}
|
|
244
|
+
|
|
245
|
+
async def handler(req):
|
|
246
|
+
called["n"] += 1
|
|
247
|
+
return "REACHED"
|
|
248
|
+
|
|
249
|
+
res = await mw.awrap_tool_call(_req("execute", {"command": cmd}), handler)
|
|
250
|
+
assert called["n"] == 0
|
|
251
|
+
assert res.status == "error"
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
@pytest.mark.asyncio
|
|
255
|
+
async def test_execute_relative_allowed(workspace):
|
|
256
|
+
"""execute 用相对路径 / 虚拟路径 / $_SANDBOX_WORKSPACE → 放行。"""
|
|
257
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
258
|
+
|
|
259
|
+
async def handler(req):
|
|
260
|
+
return "REACHED"
|
|
261
|
+
|
|
262
|
+
for cmd in ["cat ./SKILL.md",
|
|
263
|
+
"python /skills/system/x/scripts/run.py",
|
|
264
|
+
"head $_SANDBOX_WORKSPACE/skills/x.py",
|
|
265
|
+
"ls /etc"]:
|
|
266
|
+
res = await mw.awrap_tool_call(_req("execute", {"command": cmd}), handler)
|
|
267
|
+
assert res == "REACHED", f"误拦了正常命令: {cmd}"
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
# ============== 无关工具 / 边界 ==============
|
|
271
|
+
|
|
272
|
+
@pytest.mark.asyncio
|
|
273
|
+
async def test_unrelated_tool_passthrough(workspace):
|
|
274
|
+
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
275
|
+
|
|
276
|
+
async def handler(req):
|
|
277
|
+
return "REACHED"
|
|
278
|
+
|
|
279
|
+
res = await mw.awrap_tool_call(
|
|
280
|
+
_req("web_search", {"queries": ["x"]}), handler)
|
|
281
|
+
assert res == "REACHED"
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
@pytest.mark.asyncio
|
|
285
|
+
async def test_no_user_id_still_blocks_cross_user(workspace):
|
|
286
|
+
"""user_id 为空(self_ws 算不出)时:自己的也改不了,但跨用户的越权仍要拦。"""
|
|
287
|
+
mw = SandboxPathGuardMiddleware("")
|
|
288
|
+
other = os.path.join(workspace, "gary.liu", "skills", "x", "SKILL.md")
|
|
289
|
+
called = {"n": 0}
|
|
290
|
+
|
|
291
|
+
async def handler(req):
|
|
292
|
+
called["n"] += 1
|
|
293
|
+
return "REACHED"
|
|
294
|
+
|
|
295
|
+
res = await mw.awrap_tool_call(_req("read_file", {"file_path": other}), handler)
|
|
296
|
+
assert called["n"] == 0
|
|
297
|
+
assert res.status == "error"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/agent/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/.env.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/__init__.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/base/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/cli/__init__.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/cli/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/command/templates/web/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/capabilities/__init__.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/capabilities/console.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a19}/src/sycli/cdp/capabilities/dom.py
RENAMED
|
File without changes
|