sycommon-python-lib 0.2.7a18__tar.gz → 0.2.7a20__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.7a20}/PKG-INFO +3 -3
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/pyproject.toml +3 -3
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/deep_agent.py +2 -2
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/sandbox_path_guard.py +35 -18
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/skill_api_whitelist.py +2 -2
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/multi_agent_team.py +3 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/file_ops.py +34 -7
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/http_sandbox_backend.py +18 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/minio_sync.py +142 -25
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/sandbox.py +8 -10
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/PKG-INFO +3 -3
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/requires.txt +2 -2
- sycommon_python_lib-0.2.7a20/tests/test_sandbox_path_guard.py +297 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/README.md +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/tests/test_sync_skills_to_sandbox.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7a20
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -18,7 +18,7 @@ Requires-Dist: langchain==1.3.11
|
|
|
18
18
|
Requires-Dist: langchain-core==1.4.8
|
|
19
19
|
Requires-Dist: langchain-openai==1.3.3
|
|
20
20
|
Requires-Dist: langfuse==4.13.0
|
|
21
|
-
Requires-Dist: langgraph==1.2.
|
|
21
|
+
Requires-Dist: langgraph==1.2.8
|
|
22
22
|
Requires-Dist: langgraph-checkpoint-postgres==3.1.0
|
|
23
23
|
Requires-Dist: langgraph-checkpoint-redis==0.5.0
|
|
24
24
|
Requires-Dist: ldap3==2.9.1
|
|
@@ -43,7 +43,7 @@ Requires-Dist: minio==7.2.20
|
|
|
43
43
|
Requires-Dist: langchain-mcp-adapters==0.3.0
|
|
44
44
|
Requires-Dist: fastapi-mcp==0.4.0
|
|
45
45
|
Requires-Dist: psycopg[binary,pool]==3.3.4
|
|
46
|
-
Requires-Dist: agent-client-protocol==0.
|
|
46
|
+
Requires-Dist: agent-client-protocol==0.11.0
|
|
47
47
|
|
|
48
48
|
# sycommon-python-lib
|
|
49
49
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sycommon-python-lib"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.7a20"
|
|
4
4
|
description = "Add your description here"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -19,7 +19,7 @@ dependencies = [
|
|
|
19
19
|
"langchain-core==1.4.8",
|
|
20
20
|
"langchain-openai==1.3.3",
|
|
21
21
|
"langfuse==4.13.0",
|
|
22
|
-
"langgraph==1.2.
|
|
22
|
+
"langgraph==1.2.8",
|
|
23
23
|
"langgraph-checkpoint-postgres==3.1.0",
|
|
24
24
|
"langgraph-checkpoint-redis==0.5.0",
|
|
25
25
|
"ldap3==2.9.1",
|
|
@@ -44,7 +44,7 @@ dependencies = [
|
|
|
44
44
|
"langchain-mcp-adapters==0.3.0",
|
|
45
45
|
"fastapi-mcp==0.4.0",
|
|
46
46
|
"psycopg[binary,pool]==3.3.4",
|
|
47
|
-
"agent-client-protocol==0.
|
|
47
|
+
"agent-client-protocol==0.11.0",
|
|
48
48
|
]
|
|
49
49
|
|
|
50
50
|
[tool.setuptools]
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/deep_agent.py
RENAMED
|
@@ -1485,9 +1485,9 @@ async def _sync_skills_to_sandbox(
|
|
|
1485
1485
|
if chmod_readonly:
|
|
1486
1486
|
try:
|
|
1487
1487
|
# sandbox_dest 是虚拟绝对路径(/skills/system),沙箱 shell 不重映射裸绝对路径,
|
|
1488
|
-
# 须拼 $
|
|
1488
|
+
# 须拼 $SANDBOX_ROOT 指向真实 workspace 才能命中。否则 chmod 静默失败。
|
|
1489
1489
|
await backend.aexecute(
|
|
1490
|
-
f'chmod -R 555 "$
|
|
1490
|
+
f'chmod -R 555 "$SANDBOX_ROOT{sandbox_dest}"',
|
|
1491
1491
|
_skip_lazy_sync=True)
|
|
1492
1492
|
SYLogger.info(f"[DeepAgent] 已设只读: chmod -R 555 {sandbox_dest}")
|
|
1493
1493
|
except Exception as e:
|
|
@@ -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):命令串里的宿主绝对路径无法安全改写,只能拦
|
|
@@ -47,8 +47,8 @@ _PUSH_FILES = [
|
|
|
47
47
|
("sitecustomize.py", ".wl/sitecustomize.py"),
|
|
48
48
|
("skill_wl_check.py", ".wl/skill_wl_check.py"),
|
|
49
49
|
]
|
|
50
|
-
# workspace 内白名单目录的 shell 形式(init_script 已 export $
|
|
51
|
-
_WL_DIR = "$
|
|
50
|
+
# workspace 内白名单目录的 shell 形式(init_script 已 export $SANDBOX_ROOT,运行期展开)
|
|
51
|
+
_WL_DIR = "$SANDBOX_ROOT/.wl"
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
def _resolve_placeholders(pattern: str, env_lookup) -> Optional[str]:
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/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
|
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/agent/sandbox/file_ops.py
RENAMED
|
@@ -94,6 +94,30 @@ def _normalize_edit_error(error: str, file_path: str, old_string: str) -> str:
|
|
|
94
94
|
return messages.get(code, error)
|
|
95
95
|
|
|
96
96
|
|
|
97
|
+
# read 工具返回的“良性错误”关键词——这些是 agent 正常的文件探索/分页试探,
|
|
98
|
+
# 不是系统故障。降级为 warning 而非 ERROR,避免淹没真正的错误日志。
|
|
99
|
+
# 文案与 sycommon/middleware/sandbox.py 服务端 read 的错误返回对齐。
|
|
100
|
+
_BENIGN_READ_ERROR_MARKERS = (
|
|
101
|
+
"not found", # agent 试探性读取不存在的路径
|
|
102
|
+
"outside the sandbox", # 安全守卫拦截宿主绝对路径,agent 会自愈改用虚拟路径
|
|
103
|
+
"exceeds maximum preview size", # 二进制文件超 500KiB,agent 在探索文件结构
|
|
104
|
+
"exceeds file length", # 分页 offset 超出文件实际行数,agent 翻页越界
|
|
105
|
+
"empty contents", # 空文件提示
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _is_benign_read_error(err_msg: str) -> bool:
|
|
110
|
+
"""判断 read 错误是否为 agent 正常工具行为(应降级为 warning 而非 ERROR)。
|
|
111
|
+
|
|
112
|
+
这些都是 LLM 探索文件系统时的正常试探/边界:路径不存在、宿主绝对路径、
|
|
113
|
+
大二进制文件、分页越界、空文件。若全刷成 ERROR 会淹没真正的异常日志。
|
|
114
|
+
"""
|
|
115
|
+
if not err_msg:
|
|
116
|
+
return False
|
|
117
|
+
low = err_msg.lower()
|
|
118
|
+
return any(marker in low for marker in _BENIGN_READ_ERROR_MARKERS)
|
|
119
|
+
|
|
120
|
+
|
|
97
121
|
@dataclass
|
|
98
122
|
class TreeResult:
|
|
99
123
|
"""tree 操作结果"""
|
|
@@ -311,8 +335,12 @@ class FileOperationsMixin:
|
|
|
311
335
|
detail = str(result)[:200] if result else "(empty)"
|
|
312
336
|
return ReadResult(error=f"File '{file_path}': unexpected server response: {detail}")
|
|
313
337
|
if result.get("error"):
|
|
314
|
-
|
|
315
|
-
|
|
338
|
+
err_msg = result['error']
|
|
339
|
+
if _is_benign_read_error(err_msg):
|
|
340
|
+
SYLogger.warning(f"[Sandbox] 读取文件未命中(良性): {err_msg}")
|
|
341
|
+
else:
|
|
342
|
+
SYLogger.error(f"[Sandbox] 读取文件失败: {err_msg}")
|
|
343
|
+
return ReadResult(error=f"File '{file_path}': {err_msg}")
|
|
316
344
|
content = result.get("content", "")
|
|
317
345
|
encoding = result.get("encoding", "utf-8")
|
|
318
346
|
SYLogger.info(
|
|
@@ -361,11 +389,10 @@ class FileOperationsMixin:
|
|
|
361
389
|
return ReadResult(error=f"File '{file_path}': unexpected server response: {detail}")
|
|
362
390
|
if result.get("error"):
|
|
363
391
|
err_msg = result['error']
|
|
364
|
-
if
|
|
365
|
-
#
|
|
366
|
-
#
|
|
367
|
-
|
|
368
|
-
SYLogger.warning(f"[Sandbox] 异步读取文件未找到: {err_msg}")
|
|
392
|
+
if _is_benign_read_error(err_msg):
|
|
393
|
+
# 见 _is_benign_read_error:agent 正常的文件探索/分页试探,
|
|
394
|
+
# 降级为 warning 避免淹没真正的异常日志。
|
|
395
|
+
SYLogger.warning(f"[Sandbox] 异步读取文件未命中(良性): {err_msg}")
|
|
369
396
|
else:
|
|
370
397
|
SYLogger.error(f"[Sandbox] 异步读取文件失败: {err_msg}")
|
|
371
398
|
return ReadResult(error=f"File '{file_path}': {err_msg}")
|
|
@@ -473,6 +473,24 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
|
|
|
473
473
|
SYLogger.info(
|
|
474
474
|
f"[Sandbox] MinIO 恢复完成: {restored} 个文件")
|
|
475
475
|
finally:
|
|
476
|
+
# restore_from_minio 复用了共享 backend self,内部经
|
|
477
|
+
# aupload_files -> _get_async_session() 的 loop 不匹配逻辑,
|
|
478
|
+
# 会在【本临时 loop】上惰性创建 aiohttp ClientSession。
|
|
479
|
+
# 临时 loop 关闭前必须把这个 session 关掉,否则 loop.close()
|
|
480
|
+
# 后它成为孤儿,aiohttp GC 时刷
|
|
481
|
+
# "Unclosed client session" / "Unclosed connector"。
|
|
482
|
+
# 仅当 session 确实绑定在本临时 loop 上才动它
|
|
483
|
+
# (restore 若是空操作则 self._async_session 仍是主 loop 的,不能误关)。
|
|
484
|
+
if (self._async_session is not None
|
|
485
|
+
and not self._async_session.closed
|
|
486
|
+
and self._session_loop_id == id(loop)):
|
|
487
|
+
try:
|
|
488
|
+
loop.run_until_complete(
|
|
489
|
+
self._async_session.close())
|
|
490
|
+
except Exception:
|
|
491
|
+
pass
|
|
492
|
+
self._async_session = None
|
|
493
|
+
self._session_loop_id = None
|
|
476
494
|
loop.close()
|
|
477
495
|
except Exception as e:
|
|
478
496
|
SYLogger.warning(
|
|
@@ -292,28 +292,30 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
292
292
|
|
|
293
293
|
# ============== 批量扫描同步 ==============
|
|
294
294
|
|
|
295
|
-
def collect_sandbox_files(self, tree_result) ->
|
|
296
|
-
"""从沙箱 tree
|
|
295
|
+
def collect_sandbox_files(self, tree_result) -> dict[str, int]:
|
|
296
|
+
"""从沙箱 tree 结果收集 {文件路径: 大小}。
|
|
297
297
|
|
|
298
|
-
tree 根节点 name 通常是 user_id(如 "osulcode.xiao"
|
|
299
|
-
|
|
300
|
-
|
|
298
|
+
tree 根节点 name 通常是 user_id(如 "osulcode.xiao"),收集时跳过根节点,
|
|
299
|
+
从 children 开始递归,路径不含 user_id 前缀,与 astat/adownload_files 语义一致。
|
|
300
|
+
size 取节点 .size,缺失记为 -1(表示「未知」,diff 时按「可能变化」处理,即重传)。
|
|
301
|
+
|
|
302
|
+
用 size 做 diff 是为了让「会话中途直推过、随后 agent 原地改写」的文件能在
|
|
303
|
+
会话末尾扫描时被重新同步(否则路径已存在会被当成无变化忽略,丢掉改写后的版本)。
|
|
301
304
|
"""
|
|
302
305
|
if tree_result.error or not tree_result.tree:
|
|
303
|
-
return
|
|
306
|
+
return {}
|
|
304
307
|
|
|
305
308
|
root = tree_result.tree
|
|
306
|
-
files =
|
|
309
|
+
files: dict[str, int] = {}
|
|
307
310
|
if root.is_dir and root.children:
|
|
308
311
|
for child in root.children:
|
|
309
312
|
self._collect_files_from_node(child, "", files)
|
|
310
313
|
|
|
311
|
-
# tree
|
|
312
|
-
|
|
313
|
-
return files
|
|
314
|
+
# tree 文件过多时插入 "... (truncated, max N files)" 虚拟节点,过滤掉
|
|
315
|
+
return {fp: sz for fp, sz in files.items() if "truncated" not in fp}
|
|
314
316
|
|
|
315
|
-
def _collect_files_from_node(self, node, prefix: str, files:
|
|
316
|
-
"""
|
|
317
|
+
def _collect_files_from_node(self, node, prefix: str, files: dict[str, int]):
|
|
318
|
+
"""递归收集文件节点到 {path: size}"""
|
|
317
319
|
if not node:
|
|
318
320
|
return
|
|
319
321
|
|
|
@@ -324,21 +326,26 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
324
326
|
for child in node.children:
|
|
325
327
|
self._collect_files_from_node(child, path, files)
|
|
326
328
|
else:
|
|
327
|
-
|
|
329
|
+
# size 缺失(None)记为 -1,diff 时按「可能变化」处理,避免漏传
|
|
330
|
+
size = node.size if node.size is not None else -1
|
|
331
|
+
files[path] = size
|
|
328
332
|
|
|
329
|
-
def _exclude_system_skills(self, files
|
|
333
|
+
def _exclude_system_skills(self, files) -> list[str]:
|
|
330
334
|
"""过滤掉 /skills/system/ 前缀文件——system 是只读仓库产物,不进 MinIO。
|
|
331
335
|
|
|
332
336
|
路径形如 skills/system/sy-oa-skill/...(collect_sandbox_files 已 strip 根 user_id
|
|
333
337
|
前缀,根盘符 / 由调用方拼接)。兼容带不带前导斜杠。
|
|
338
|
+
|
|
339
|
+
files 可为 dict({path:size})或 list[str]:dict 时按 key 过滤并返回新 dict,
|
|
340
|
+
list 时按元素过滤并返回新 list。
|
|
334
341
|
"""
|
|
335
|
-
|
|
336
|
-
for fp in files:
|
|
342
|
+
def _keep(fp):
|
|
337
343
|
norm = fp.replace("\\", "/").lstrip("/")
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
344
|
+
return not (norm == "skills/system" or norm.startswith("skills/system/"))
|
|
345
|
+
|
|
346
|
+
if isinstance(files, dict):
|
|
347
|
+
return {fp: sz for fp, sz in files.items() if _keep(fp)}
|
|
348
|
+
return [fp for fp in files if _keep(fp)]
|
|
342
349
|
|
|
343
350
|
async def sync_sandbox_to_minio(self, sandbox_backend, user_id: str) -> int:
|
|
344
351
|
"""扫描沙箱目录,增量同步文件到 MinIO
|
|
@@ -390,7 +397,7 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
390
397
|
|
|
391
398
|
prefix = f"{user_id.lower()}/{dir_name}/"
|
|
392
399
|
|
|
393
|
-
# 3. 获取 MinIO
|
|
400
|
+
# 3. 获取 MinIO 已有副本({相对路径: MinioObject},取其 .size 做 diff)
|
|
394
401
|
existing_objects = {}
|
|
395
402
|
try:
|
|
396
403
|
objects = await asyncio.to_thread(
|
|
@@ -403,14 +410,21 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
403
410
|
except Exception as e:
|
|
404
411
|
SYLogger.warning(f"[MinIO] 列出已有副本失败,将全量上传: {e}")
|
|
405
412
|
|
|
406
|
-
# 4.
|
|
407
|
-
|
|
413
|
+
# 4. 找出需要同步的文件:
|
|
414
|
+
# - MinIO 中没有(新增)
|
|
415
|
+
# - 或 MinIO 有但 size 不一致(被改写,含「中途直推过初版、随后改写」的场景)
|
|
416
|
+
# 注意 sandbox size 未知(-1)一律视为变化,宁可重传也不漏传。
|
|
408
417
|
changed_files = [
|
|
409
|
-
fp for fp in sandbox_files
|
|
418
|
+
fp for fp, sz in sandbox_files.items()
|
|
419
|
+
if fp not in existing_objects
|
|
420
|
+
or sz < 0
|
|
421
|
+
or existing_objects[fp].size != sz
|
|
422
|
+
]
|
|
410
423
|
|
|
411
424
|
# 5. 找出需要删除的文件(MinIO 中存在但沙箱中已不存在)
|
|
412
425
|
deleted_files = [
|
|
413
|
-
fp for fp in existing_objects if fp not in
|
|
426
|
+
fp for fp in existing_objects if fp not in sandbox_files
|
|
427
|
+
]
|
|
414
428
|
|
|
415
429
|
# 删除 MinIO 中的孤立文件
|
|
416
430
|
if deleted_files:
|
|
@@ -486,6 +500,109 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
486
500
|
SYLogger.warning(f"[MinIO] 同步文件异常: {fp}, error={e}")
|
|
487
501
|
return False
|
|
488
502
|
|
|
503
|
+
# ============== 用户上传文件直推(fire-and-forget 后台)==============
|
|
504
|
+
# 用户刚传上来的文件优先落 MinIO:不等会话结束扫描,免得沙箱中途崩溃丢文件。
|
|
505
|
+
# 这两条只做“上传”,不删孤儿、不扫描;会话末尾的全量扫描仍负责 diff/清理。
|
|
506
|
+
_background_tasks: set = set()
|
|
507
|
+
|
|
508
|
+
@staticmethod
|
|
509
|
+
def make_user_file_key(user_id: str, file_path: str) -> str:
|
|
510
|
+
"""构造 {user_id}/current/{path} 的 object key(对外共用,调用方也用得上)"""
|
|
511
|
+
clean = file_path.replace("\\", "/").lstrip("./").lstrip("/")
|
|
512
|
+
return f"{user_id.lower()}/current/{clean}"
|
|
513
|
+
|
|
514
|
+
def _push_batch_sync(self, user_id: str, files: list[tuple[str, bytes]]) -> int:
|
|
515
|
+
"""同步直推一批已落盘的用户文件到 MinIO(阻塞,跑在后台线程)
|
|
516
|
+
|
|
517
|
+
files: [(相对路径, 文件内容), ...],相对路径不带前导 /(与沙箱根语义一致)。
|
|
518
|
+
返回成功条数。逐文件做,单文件失败不影响其余。
|
|
519
|
+
"""
|
|
520
|
+
if not self._client:
|
|
521
|
+
return 0
|
|
522
|
+
ok = 0
|
|
523
|
+
for fp, content in files:
|
|
524
|
+
object_key = self.make_user_file_key(user_id, fp)
|
|
525
|
+
mime_type, _ = mimetypes.guess_type(fp)
|
|
526
|
+
if self.upload_bytes(
|
|
527
|
+
object_key, content,
|
|
528
|
+
content_type=mime_type or "application/octet-stream",
|
|
529
|
+
):
|
|
530
|
+
ok += 1
|
|
531
|
+
return ok
|
|
532
|
+
|
|
533
|
+
async def _push_batch_async(self, user_id: str, files: list[tuple[str, bytes]]) -> int:
|
|
534
|
+
"""异步直推一批用户文件:并发上传,单文件失败不影响其余。
|
|
535
|
+
|
|
536
|
+
并发 cap 与全量同步的 CONCURRENT_BATCH 对齐(5),避免突发上传打满 MinIO。
|
|
537
|
+
"""
|
|
538
|
+
if not self._client:
|
|
539
|
+
return 0
|
|
540
|
+
if not files:
|
|
541
|
+
return 0
|
|
542
|
+
|
|
543
|
+
async def _one(fp, content):
|
|
544
|
+
object_key = self.make_user_file_key(user_id, fp)
|
|
545
|
+
mime_type, _ = mimetypes.guess_type(fp)
|
|
546
|
+
return await self.aupload_bytes(
|
|
547
|
+
object_key, content,
|
|
548
|
+
content_type=mime_type or "application/octet-stream",
|
|
549
|
+
)
|
|
550
|
+
|
|
551
|
+
results = await asyncio.gather(
|
|
552
|
+
*(_one(fp, c) for fp, c in files), return_exceptions=True
|
|
553
|
+
)
|
|
554
|
+
return sum(1 for r in results if r is True)
|
|
555
|
+
|
|
556
|
+
def push_user_files_batch(self, user_id: str, files: list[tuple[str, bytes]]) -> None:
|
|
557
|
+
"""用户上传后立即 fire-and-forget 直推 MinIO(首选入口,安全无副作用)。
|
|
558
|
+
|
|
559
|
+
在独立后台线程/事件循环上跑,绝不阻塞调用方(上传响应/聊天)。MinIO 不可用
|
|
560
|
+
或上传失败都不影响主流程,只记日志——会话末尾的全量扫描会兜底。
|
|
561
|
+
保持对 _background_tasks 的强引用,防止 GC 提前回收正在跑的任务。
|
|
562
|
+
"""
|
|
563
|
+
if not self.is_available():
|
|
564
|
+
return
|
|
565
|
+
# 去掉空内容/空路径,并 strip 前导斜杠与 ./
|
|
566
|
+
norm = []
|
|
567
|
+
for fp, content in files:
|
|
568
|
+
if not fp or content is None:
|
|
569
|
+
continue
|
|
570
|
+
clean = fp.replace("\\", "/").lstrip("./").lstrip("/")
|
|
571
|
+
if not clean:
|
|
572
|
+
continue
|
|
573
|
+
norm.append((clean, content))
|
|
574
|
+
if not norm:
|
|
575
|
+
return
|
|
576
|
+
|
|
577
|
+
# 逐个 upload_bytes 是同步 minio SDK 调用,丢到线程里做更省事也更稳;
|
|
578
|
+
# 这里用一整批一个 to_thread 而不是每文件一个,减少线程调度开销。
|
|
579
|
+
async def _run():
|
|
580
|
+
try:
|
|
581
|
+
ok = await asyncio.to_thread(self._push_batch_sync, user_id, norm)
|
|
582
|
+
SYLogger.info(
|
|
583
|
+
f"[MinIO] 用户文件已直推: user={user_id}, ok={ok}/{len(norm)}")
|
|
584
|
+
except Exception as e:
|
|
585
|
+
SYLogger.warning(f"[MinIO] 用户文件直推失败(不影响主流程): user={user_id}, error={e}")
|
|
586
|
+
|
|
587
|
+
try:
|
|
588
|
+
coro = _run()
|
|
589
|
+
self._background_tasks.add(coro)
|
|
590
|
+
coro.add_done_callback(self._background_tasks.discard)
|
|
591
|
+
asyncio.ensure_future(coro)
|
|
592
|
+
except RuntimeError:
|
|
593
|
+
# 无运行中的事件循环(极少数调用上下文),退化为后台线程兜底
|
|
594
|
+
import threading
|
|
595
|
+
def _bg():
|
|
596
|
+
try:
|
|
597
|
+
ok = self._push_batch_sync(user_id, norm)
|
|
598
|
+
SYLogger.info(
|
|
599
|
+
f"[MinIO] 用户文件已直推(bg-thread): user={user_id}, ok={ok}/{len(norm)}")
|
|
600
|
+
except Exception as e:
|
|
601
|
+
SYLogger.warning(f"[MinIO] 用户文件直推失败(bg): user={user_id}, error={e}")
|
|
602
|
+
threading.Thread(
|
|
603
|
+
target=_bg, name=f"minio-userpush-{user_id}", daemon=True
|
|
604
|
+
).start()
|
|
605
|
+
|
|
489
606
|
# ============== 反向同步(MinIO → 沙箱) ==============
|
|
490
607
|
|
|
491
608
|
async def restore_from_minio(self, sandbox_backend, user_id: str) -> int:
|
{sycommon_python_lib-0.2.7a18 → sycommon_python_lib-0.2.7a20}/src/sycommon/middleware/sandbox.py
RENAMED
|
@@ -136,7 +136,6 @@ def _build_init_script(workspace: str) -> str:
|
|
|
136
136
|
safe_workspace = workspace.replace("'", "''")
|
|
137
137
|
return f'''
|
|
138
138
|
$env:SANDBOX_ROOT = '{safe_workspace}'
|
|
139
|
-
$env:_SANDBOX_WORKSPACE = '{safe_workspace}'
|
|
140
139
|
Set-Location '{safe_workspace}'
|
|
141
140
|
'''
|
|
142
141
|
|
|
@@ -144,7 +143,6 @@ Set-Location '{safe_workspace}'
|
|
|
144
143
|
return f'''
|
|
145
144
|
# 沙箱环境初始化
|
|
146
145
|
export SANDBOX_ROOT={safe_workspace}
|
|
147
|
-
export _SANDBOX_WORKSPACE={safe_workspace}
|
|
148
146
|
|
|
149
147
|
# 资源限制(防止失控进程)
|
|
150
148
|
ulimit -f 1048576 2>/dev/null # 单文件最大 1GB
|
|
@@ -154,7 +152,7 @@ ulimit -c 0 2>/dev/null # 禁止 core dump
|
|
|
154
152
|
sandbox_path() {{
|
|
155
153
|
local path="$1"
|
|
156
154
|
# 如果路径已经在 workspace 内,直接返回
|
|
157
|
-
if [[ "$path" == "$
|
|
155
|
+
if [[ "$path" == "$SANDBOX_ROOT"* ]]; then
|
|
158
156
|
echo "$path"
|
|
159
157
|
return
|
|
160
158
|
fi
|
|
@@ -162,7 +160,7 @@ sandbox_path() {{
|
|
|
162
160
|
if [[ "$path" == /* ]]; then
|
|
163
161
|
# 移除开头的 /
|
|
164
162
|
path="${{path#/}}"
|
|
165
|
-
echo "$
|
|
163
|
+
echo "$SANDBOX_ROOT/$path"
|
|
166
164
|
else
|
|
167
165
|
# 相对路径,基于当前目录
|
|
168
166
|
echo "$path"
|
|
@@ -173,13 +171,13 @@ sandbox_path() {{
|
|
|
173
171
|
cd() {{
|
|
174
172
|
local target="$1"
|
|
175
173
|
if [[ -z "$target" ]]; then
|
|
176
|
-
command cd "$
|
|
177
|
-
elif [[ "$target" == "$
|
|
174
|
+
command cd "$SANDBOX_ROOT"
|
|
175
|
+
elif [[ "$target" == "$SANDBOX_ROOT"* ]]; then
|
|
178
176
|
# 路径已经在 workspace 内,直接 cd
|
|
179
177
|
command cd "$target"
|
|
180
178
|
elif [[ "$target" == /* ]]; then
|
|
181
179
|
# 其他绝对路径映射到沙箱内
|
|
182
|
-
local mapped="$
|
|
180
|
+
local mapped="$SANDBOX_ROOT/${{target#/}}"
|
|
183
181
|
command cd "$mapped"
|
|
184
182
|
else
|
|
185
183
|
command cd "$target"
|
|
@@ -191,11 +189,11 @@ mkdir() {{
|
|
|
191
189
|
local args=("$@")
|
|
192
190
|
local new_args=()
|
|
193
191
|
for arg in "${{args[@]}}"; do
|
|
194
|
-
if [[ "$arg" == "$
|
|
192
|
+
if [[ "$arg" == "$SANDBOX_ROOT"* ]]; then
|
|
195
193
|
# 路径已经在 workspace 内,直接使用
|
|
196
194
|
new_args+=("$arg")
|
|
197
195
|
elif [[ "$arg" == /* ]]; then
|
|
198
|
-
new_args+=("$
|
|
196
|
+
new_args+=("$SANDBOX_ROOT/${{arg#/}}")
|
|
199
197
|
else
|
|
200
198
|
new_args+=("$arg")
|
|
201
199
|
fi
|
|
@@ -204,7 +202,7 @@ mkdir() {{
|
|
|
204
202
|
}}
|
|
205
203
|
|
|
206
204
|
# 切换到 workspace 目录
|
|
207
|
-
cd "$
|
|
205
|
+
cd "$SANDBOX_ROOT"
|
|
208
206
|
'''
|
|
209
207
|
|
|
210
208
|
def _sanitize_user_id(user_id: str) -> str:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7a20
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -18,7 +18,7 @@ Requires-Dist: langchain==1.3.11
|
|
|
18
18
|
Requires-Dist: langchain-core==1.4.8
|
|
19
19
|
Requires-Dist: langchain-openai==1.3.3
|
|
20
20
|
Requires-Dist: langfuse==4.13.0
|
|
21
|
-
Requires-Dist: langgraph==1.2.
|
|
21
|
+
Requires-Dist: langgraph==1.2.8
|
|
22
22
|
Requires-Dist: langgraph-checkpoint-postgres==3.1.0
|
|
23
23
|
Requires-Dist: langgraph-checkpoint-redis==0.5.0
|
|
24
24
|
Requires-Dist: ldap3==2.9.1
|
|
@@ -43,7 +43,7 @@ Requires-Dist: minio==7.2.20
|
|
|
43
43
|
Requires-Dist: langchain-mcp-adapters==0.3.0
|
|
44
44
|
Requires-Dist: fastapi-mcp==0.4.0
|
|
45
45
|
Requires-Dist: psycopg[binary,pool]==3.3.4
|
|
46
|
-
Requires-Dist: agent-client-protocol==0.
|
|
46
|
+
Requires-Dist: agent-client-protocol==0.11.0
|
|
47
47
|
|
|
48
48
|
# sycommon-python-lib
|
|
49
49
|
|
|
@@ -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
|
|
@@ -12,7 +12,7 @@ langchain==1.3.11
|
|
|
12
12
|
langchain-core==1.4.8
|
|
13
13
|
langchain-openai==1.3.3
|
|
14
14
|
langfuse==4.13.0
|
|
15
|
-
langgraph==1.2.
|
|
15
|
+
langgraph==1.2.8
|
|
16
16
|
langgraph-checkpoint-postgres==3.1.0
|
|
17
17
|
langgraph-checkpoint-redis==0.5.0
|
|
18
18
|
ldap3==2.9.1
|
|
@@ -37,4 +37,4 @@ minio==7.2.20
|
|
|
37
37
|
langchain-mcp-adapters==0.3.0
|
|
38
38
|
fastapi-mcp==0.4.0
|
|
39
39
|
psycopg[binary,pool]==3.3.4
|
|
40
|
-
agent-client-protocol==0.
|
|
40
|
+
agent-client-protocol==0.11.0
|