sycommon-python-lib 0.2.7a19__tar.gz → 0.2.7a21__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.7a19 → sycommon_python_lib-0.2.7a21}/PKG-INFO +3 -3
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/pyproject.toml +3 -3
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/deep_agent.py +2 -2
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/middleware/skill_api_whitelist.py +2 -2
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/sandbox/file_ops.py +34 -7
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/sandbox/http_sandbox_backend.py +18 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/sandbox/minio_sync.py +142 -25
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/sandbox.py +13 -10
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon_python_lib.egg-info/PKG-INFO +3 -3
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon_python_lib.egg-info/requires.txt +2 -2
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_sandbox_path_guard.py +2 -2
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/README.md +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/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.7a21
|
|
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.7a21"
|
|
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.7a19 → sycommon_python_lib-0.2.7a21}/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:
|
|
@@ -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.7a19 → sycommon_python_lib-0.2.7a21}/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.7a19 → sycommon_python_lib-0.2.7a21}/src/sycommon/middleware/sandbox.py
RENAMED
|
@@ -136,7 +136,7 @@ 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:
|
|
139
|
+
$env:SANDBOX_OUTPUT = Join-Path '{safe_workspace}' 'output'
|
|
140
140
|
Set-Location '{safe_workspace}'
|
|
141
141
|
'''
|
|
142
142
|
|
|
@@ -144,7 +144,9 @@ Set-Location '{safe_workspace}'
|
|
|
144
144
|
return f'''
|
|
145
145
|
# 沙箱环境初始化
|
|
146
146
|
export SANDBOX_ROOT={safe_workspace}
|
|
147
|
-
|
|
147
|
+
# 产物文件统一输出目录:技能脚本写产物时优先用 $SANDBOX_OUTPUT(等价 $SANDBOX_ROOT/output),
|
|
148
|
+
# 避免落技能目录等不同步 MinIO 的位置。脚本回退默认值用相对 "output"(本地开发无此变量时)。
|
|
149
|
+
export SANDBOX_OUTPUT="$SANDBOX_ROOT/output"
|
|
148
150
|
|
|
149
151
|
# 资源限制(防止失控进程)
|
|
150
152
|
ulimit -f 1048576 2>/dev/null # 单文件最大 1GB
|
|
@@ -154,7 +156,7 @@ ulimit -c 0 2>/dev/null # 禁止 core dump
|
|
|
154
156
|
sandbox_path() {{
|
|
155
157
|
local path="$1"
|
|
156
158
|
# 如果路径已经在 workspace 内,直接返回
|
|
157
|
-
if [[ "$path" == "$
|
|
159
|
+
if [[ "$path" == "$SANDBOX_ROOT"* ]]; then
|
|
158
160
|
echo "$path"
|
|
159
161
|
return
|
|
160
162
|
fi
|
|
@@ -162,7 +164,7 @@ sandbox_path() {{
|
|
|
162
164
|
if [[ "$path" == /* ]]; then
|
|
163
165
|
# 移除开头的 /
|
|
164
166
|
path="${{path#/}}"
|
|
165
|
-
echo "$
|
|
167
|
+
echo "$SANDBOX_ROOT/$path"
|
|
166
168
|
else
|
|
167
169
|
# 相对路径,基于当前目录
|
|
168
170
|
echo "$path"
|
|
@@ -173,13 +175,13 @@ sandbox_path() {{
|
|
|
173
175
|
cd() {{
|
|
174
176
|
local target="$1"
|
|
175
177
|
if [[ -z "$target" ]]; then
|
|
176
|
-
command cd "$
|
|
177
|
-
elif [[ "$target" == "$
|
|
178
|
+
command cd "$SANDBOX_ROOT"
|
|
179
|
+
elif [[ "$target" == "$SANDBOX_ROOT"* ]]; then
|
|
178
180
|
# 路径已经在 workspace 内,直接 cd
|
|
179
181
|
command cd "$target"
|
|
180
182
|
elif [[ "$target" == /* ]]; then
|
|
181
183
|
# 其他绝对路径映射到沙箱内
|
|
182
|
-
local mapped="$
|
|
184
|
+
local mapped="$SANDBOX_ROOT/${{target#/}}"
|
|
183
185
|
command cd "$mapped"
|
|
184
186
|
else
|
|
185
187
|
command cd "$target"
|
|
@@ -191,11 +193,11 @@ mkdir() {{
|
|
|
191
193
|
local args=("$@")
|
|
192
194
|
local new_args=()
|
|
193
195
|
for arg in "${{args[@]}}"; do
|
|
194
|
-
if [[ "$arg" == "$
|
|
196
|
+
if [[ "$arg" == "$SANDBOX_ROOT"* ]]; then
|
|
195
197
|
# 路径已经在 workspace 内,直接使用
|
|
196
198
|
new_args+=("$arg")
|
|
197
199
|
elif [[ "$arg" == /* ]]; then
|
|
198
|
-
new_args+=("$
|
|
200
|
+
new_args+=("$SANDBOX_ROOT/${{arg#/}}")
|
|
199
201
|
else
|
|
200
202
|
new_args+=("$arg")
|
|
201
203
|
fi
|
|
@@ -204,7 +206,7 @@ mkdir() {{
|
|
|
204
206
|
}}
|
|
205
207
|
|
|
206
208
|
# 切换到 workspace 目录
|
|
207
|
-
cd "$
|
|
209
|
+
cd "$SANDBOX_ROOT"
|
|
208
210
|
'''
|
|
209
211
|
|
|
210
212
|
def _sanitize_user_id(user_id: str) -> str:
|
|
@@ -469,6 +471,7 @@ def setup_sandbox_handler(app: FastAPI, config: dict = None):
|
|
|
469
471
|
env["TEMP"] = os.path.join(workspace, "tmp")
|
|
470
472
|
env["TMP"] = os.path.join(workspace, "tmp")
|
|
471
473
|
env["SANDBOX_ROOT"] = workspace
|
|
474
|
+
env["SANDBOX_OUTPUT"] = os.path.join(workspace, "output")
|
|
472
475
|
|
|
473
476
|
try:
|
|
474
477
|
# 使用 asyncio.create_subprocess_shell 异步执行命令,避免阻塞事件循环
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7a21
|
|
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
|
|
|
@@ -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
|
{sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/tests/test_sandbox_path_guard.py
RENAMED
|
@@ -253,7 +253,7 @@ async def test_execute_host_abs_path_denied(workspace):
|
|
|
253
253
|
|
|
254
254
|
@pytest.mark.asyncio
|
|
255
255
|
async def test_execute_relative_allowed(workspace):
|
|
256
|
-
"""execute 用相对路径 / 虚拟路径 / $
|
|
256
|
+
"""execute 用相对路径 / 虚拟路径 / $SANDBOX_ROOT → 放行。"""
|
|
257
257
|
mw = SandboxPathGuardMiddleware("osulcode.xiao")
|
|
258
258
|
|
|
259
259
|
async def handler(req):
|
|
@@ -261,7 +261,7 @@ async def test_execute_relative_allowed(workspace):
|
|
|
261
261
|
|
|
262
262
|
for cmd in ["cat ./SKILL.md",
|
|
263
263
|
"python /skills/system/x/scripts/run.py",
|
|
264
|
-
"head $
|
|
264
|
+
"head $SANDBOX_ROOT/skills/x.py",
|
|
265
265
|
"ls /etc"]:
|
|
266
266
|
res = await mw.awrap_tool_call(_req("execute", {"command": cmd}), handler)
|
|
267
267
|
assert res == "REACHED", f"误拦了正常命令: {cmd}"
|
|
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.7a19 → sycommon_python_lib-0.2.7a21}/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.7a19 → sycommon_python_lib-0.2.7a21}/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.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/.env.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/__init__.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.7a19 → sycommon_python_lib-0.2.7a21}/src/command/templates/base/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|