sycommon-python-lib 0.2.7a22__tar.gz → 0.2.7a23__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.7a22 → sycommon_python_lib-0.2.7a23}/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/pyproject.toml +1 -1
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/skill_api_whitelist.py +149 -23
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/file_ops.py +61 -27
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/http_sandbox_backend.py +11 -6
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/sandbox.py +166 -59
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/README.md +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/tests/test_sync_skills_to_sandbox.py +0 -0
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
allowlist:[] 空数组 → 注入空白名单(全拦截)。
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
+
import base64
|
|
23
|
+
import hashlib
|
|
22
24
|
import json
|
|
23
25
|
import os
|
|
24
26
|
import re
|
|
@@ -26,6 +28,7 @@ import shlex
|
|
|
26
28
|
from typing import Optional
|
|
27
29
|
|
|
28
30
|
from langchain.agents.middleware.types import AgentMiddleware
|
|
31
|
+
from langchain_core.messages import ToolMessage
|
|
29
32
|
from langgraph.prebuilt.tool_node import ToolCallRequest
|
|
30
33
|
|
|
31
34
|
from sycommon.logging.kafka_log import SYLogger
|
|
@@ -41,14 +44,94 @@ _SKILL_TOP_RE = re.compile(
|
|
|
41
44
|
# BASE_URL 占位符 ${VAR}
|
|
42
45
|
_PLACEHOLDER_RE = re.compile(r'\$\{([A-Z_][A-Z0-9_]*)\}')
|
|
43
46
|
|
|
44
|
-
# 推送到沙箱 workspace 内的 .wl 目录(沙箱强制路径隔离,绝对路径会被映射进 workspace,
|
|
45
|
-
# 故用相对 POSIX 路径,落地为 {workspace}/.wl/,再 export PYTHONPATH 让 Python 自动 import)
|
|
46
|
-
_PUSH_FILES = [
|
|
47
|
-
("sitecustomize.py", ".wl/sitecustomize.py"),
|
|
48
|
-
("skill_wl_check.py", ".wl/skill_wl_check.py"),
|
|
49
|
-
]
|
|
50
47
|
# workspace 内白名单目录的 shell 形式(init_script 已 export $SANDBOX_ROOT,运行期展开)
|
|
51
48
|
_WL_DIR = "$SANDBOX_ROOT/.wl"
|
|
49
|
+
# .wl 目录在 workspace 内的相对路径段(用于 hash 校验命令里的文件名)
|
|
50
|
+
_WL_FILES = [
|
|
51
|
+
".wl/sitecustomize.py", # 极小 loader(明文,无业务逻辑)
|
|
52
|
+
".wl/sitecustomize.payload", # sitecustomize.py 源码的 base64
|
|
53
|
+
".wl/skill_wl_check.payload", # skill_wl_check.py 源码的 base64
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
# ---- 极小 loader(落盘为 .wl/sitecustomize.py)----
|
|
57
|
+
# 不含任何白名单/拦截业务逻辑,只做"解码同目录 payload + exec"。
|
|
58
|
+
# 关键:把 skill_wl_check 注册成真模块对象进 sys.modules,使 sitecustomize.payload
|
|
59
|
+
# 里的 `import skill_wl_check; skill_wl_check.match(...)` 按原逻辑工作(逻辑不变)。
|
|
60
|
+
_LOADER_SRC = b'''# sycommon injected loader: decode payloads, exec them. No business logic.
|
|
61
|
+
import os, sys, base64, types
|
|
62
|
+
_HERE = os.path.dirname(os.path.abspath(__file__))
|
|
63
|
+
if _HERE not in sys.path:
|
|
64
|
+
sys.path.insert(0, _HERE)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _run(name, ns):
|
|
68
|
+
p = os.path.join(_HERE, name)
|
|
69
|
+
try:
|
|
70
|
+
with open(p, "rb") as f:
|
|
71
|
+
exec(compile(base64.b64decode(f.read()), name, "exec"), ns)
|
|
72
|
+
except Exception as _e:
|
|
73
|
+
sys.stderr.write("[.wl loader] load %s failed: %s\\n" % (name, _e))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
_wl = types.ModuleType("skill_wl_check")
|
|
77
|
+
sys.modules["skill_wl_check"] = _wl
|
|
78
|
+
_run("skill_wl_check.payload", _wl.__dict__)
|
|
79
|
+
_run("sitecustomize.payload", globals())
|
|
80
|
+
'''
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _build_payload(src_name: str) -> bytes:
|
|
84
|
+
"""读包内源码并 base64 编码,作为 .payload 落盘内容(防明文窥探)。"""
|
|
85
|
+
raw = _load_resource_bytes(src_name)
|
|
86
|
+
return base64.b64encode(raw)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _expected_hashes() -> dict:
|
|
90
|
+
"""运行时从主进程源码算各 .wl 文件的预期 sha256(hex)。
|
|
91
|
+
|
|
92
|
+
payload 的预期 hash 算的是【编码后的 base64 字节】——即沙箱里实际落盘内容,
|
|
93
|
+
这样 sha256 比对的就是真实文件内容。loader 的预期 hash 算 _LOADER_SRC(固定常量)。
|
|
94
|
+
"""
|
|
95
|
+
loader_bytes = _LOADER_SRC
|
|
96
|
+
sc_bytes = _build_payload("sitecustomize.py")
|
|
97
|
+
wl_bytes = _build_payload("skill_wl_check.py")
|
|
98
|
+
return {
|
|
99
|
+
".wl/sitecustomize.py": hashlib.sha256(loader_bytes).hexdigest(),
|
|
100
|
+
".wl/sitecustomize.payload": hashlib.sha256(sc_bytes).hexdigest(),
|
|
101
|
+
".wl/skill_wl_check.payload": hashlib.sha256(wl_bytes).hexdigest(),
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# ---- .wl 写拦截(复刻 skill_write_guard 的正则集合)----
|
|
106
|
+
# .wl 目录保护:精确匹配 .wl 或 .wl/...(带边界,防误伤 myapp.wl 之类)
|
|
107
|
+
_WL_PROTECTED_RE = re.compile(r'\.wl(?:/|\s|"|\'|$)')
|
|
108
|
+
# 写动作动词(命令首或分号/管道/空格后)
|
|
109
|
+
_WRITE_VERB_RE = re.compile(
|
|
110
|
+
r'(^|[\s;&|])(rm|rmdir|mv|cp|chmod|chown|tee|truncate|install|rsync|scp|dd|>\.wl)\b')
|
|
111
|
+
# 输出重定向 > 或 >>
|
|
112
|
+
_REDIRECT_RE = re.compile(r'>>?')
|
|
113
|
+
_WL_DENIED_MSG = "Error: .wl 为系统注入目录,禁止写入/修改/删除。"
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _command_writes_wl(cmd: str) -> bool:
|
|
117
|
+
"""execute 命令是否在写 .wl:命中 .wl 路径 且 含写动词或重定向。"""
|
|
118
|
+
if not _WL_PROTECTED_RE.search(cmd or ""):
|
|
119
|
+
return False
|
|
120
|
+
return bool(_WRITE_VERB_RE.search(cmd) or _REDIRECT_RE.search(cmd))
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _is_wl_path(p: str) -> bool:
|
|
124
|
+
"""file_path 是否落在 .wl 目录内(write_file/edit_file 拦截用)。
|
|
125
|
+
|
|
126
|
+
注意不能用 lstrip("./")——它是按字符集 strip,会把 ".wl" 的前导 "." 也吃成 "wl"。
|
|
127
|
+
改为逐前缀剥离再判。
|
|
128
|
+
"""
|
|
129
|
+
s = (p or "").strip().replace("\\", "/")
|
|
130
|
+
# 剥前导 ./ 和 /
|
|
131
|
+
while s.startswith("./") or s.startswith("/"):
|
|
132
|
+
s = s[1:] if s.startswith("/") else s[2:]
|
|
133
|
+
return s == ".wl" or s.startswith(".wl/")
|
|
134
|
+
|
|
52
135
|
|
|
53
136
|
|
|
54
137
|
def _resolve_placeholders(pattern: str, env_lookup) -> Optional[str]:
|
|
@@ -120,7 +203,8 @@ class SkillApiWhitelistMiddleware(AgentMiddleware):
|
|
|
120
203
|
|
|
121
204
|
def __init__(self, sandbox_backend):
|
|
122
205
|
self._backend = sandbox_backend
|
|
123
|
-
|
|
206
|
+
# 注:不再缓存"已推送"标志。用户可在会话中删除 .wl/ 绕过白名单,
|
|
207
|
+
# 故改为每次 execute 前校验文件完整性、缺则重推(见 _ensure_sitecustomize)。
|
|
124
208
|
|
|
125
209
|
def _env_lookup(self):
|
|
126
210
|
"""构造占位符查找器:先查主进程 os.environ,再查 sandbox env 字典。
|
|
@@ -155,27 +239,54 @@ class SkillApiWhitelistMiddleware(AgentMiddleware):
|
|
|
155
239
|
|
|
156
240
|
# ---- 懒加载:把注入脚本推进沙箱 workspace/.wl ----
|
|
157
241
|
async def _ensure_sitecustomize(self) -> bool:
|
|
158
|
-
"""把
|
|
242
|
+
"""把 loader + 2 个 base64 payload 推到沙箱 workspace 内的 .wl 目录。
|
|
159
243
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
幂等:每个 backend 实例只推一次(_pushed 标记)。失败 fail-open(不阻塞业务)。
|
|
244
|
+
防篡改 + 自愈:每次 execute 前对 3 个文件算 sha256,与主进程源码算出的
|
|
245
|
+
预期 hash 比对。任一文件缺失/被改 → 全量重推 + chmod 555。
|
|
246
|
+
旧的 test -f 存在性校验挡不住「用户把 sitecustomize 改成空文件」,
|
|
247
|
+
sha256 内容校验才能挡。失败 fail-open(不阻塞业务)。
|
|
165
248
|
"""
|
|
166
|
-
if self._pushed:
|
|
167
|
-
return True
|
|
168
249
|
backend = self._backend
|
|
169
250
|
if backend is None:
|
|
170
251
|
return False
|
|
171
252
|
try:
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
253
|
+
expected = _expected_hashes()
|
|
254
|
+
# 一条命令取三个文件的 sha256(缺失则该行输出 MISSING),换行拼接返回。
|
|
255
|
+
files_quoted = " ".join(
|
|
256
|
+
shlex.quote(f) for f in _WL_FILES)
|
|
257
|
+
check_cmd = (
|
|
258
|
+
f'for f in {files_quoted}; do '
|
|
259
|
+
f'if [ -f "$SANDBOX_ROOT/$f" ]; then '
|
|
260
|
+
f'sha256sum "$SANDBOX_ROOT/$f" 2>/dev/null | cut -d" " -f1; '
|
|
261
|
+
f'else echo MISSING; fi; done'
|
|
262
|
+
)
|
|
263
|
+
try:
|
|
264
|
+
resp = await backend.aexecute(check_cmd)
|
|
265
|
+
actual_lines = (getattr(resp, "output", "") or "").strip().splitlines()
|
|
266
|
+
except Exception:
|
|
267
|
+
actual_lines = []
|
|
268
|
+
|
|
269
|
+
# 逐文件比对:长度/顺序与 _WL_FILES 对应
|
|
270
|
+
intact = (len(actual_lines) == len(_WL_FILES)
|
|
271
|
+
and all(actual_lines[i] == expected[_WL_FILES[i]]
|
|
272
|
+
for i in range(len(_WL_FILES))))
|
|
273
|
+
|
|
274
|
+
if intact:
|
|
275
|
+
return True # 内容完整,无需重推
|
|
276
|
+
|
|
277
|
+
# 重推:loader 明文 + 2 个 payload
|
|
278
|
+
files = [
|
|
279
|
+
(".wl/sitecustomize.py", _LOADER_SRC),
|
|
280
|
+
(".wl/sitecustomize.payload", _build_payload("sitecustomize.py")),
|
|
281
|
+
(".wl/skill_wl_check.payload", _build_payload("skill_wl_check.py")),
|
|
282
|
+
]
|
|
176
283
|
await backend.aupload_files(files)
|
|
177
|
-
|
|
178
|
-
|
|
284
|
+
# chmod -R 555:挡普通用户改/删(root 仍可绕,靠 sha256 自愈兜底)
|
|
285
|
+
try:
|
|
286
|
+
await backend.aexecute(f'chmod -R 555 "{_WL_DIR}"')
|
|
287
|
+
except Exception as _ce:
|
|
288
|
+
SYLogger.warning("[Whitelist] chmod .wl 555 失败(非致命): %s", _ce)
|
|
289
|
+
SYLogger.info("[Whitelist] 注入脚本已(重新)推送至沙箱 %s (sha256 校验触发)", _WL_DIR)
|
|
179
290
|
return True
|
|
180
291
|
except Exception as e:
|
|
181
292
|
SYLogger.error("[Whitelist] 推送 sitecustomize 失败(fail-open): %s", e)
|
|
@@ -195,10 +306,25 @@ class SkillApiWhitelistMiddleware(AgentMiddleware):
|
|
|
195
306
|
handler,
|
|
196
307
|
):
|
|
197
308
|
tc = request.tool_call
|
|
198
|
-
|
|
309
|
+
name = tc.get("name")
|
|
310
|
+
args = tc.get("args", {}) or {}
|
|
311
|
+
|
|
312
|
+
# ---- .wl 写拦截(短路 fail-closed,在任何业务逻辑之前)----
|
|
313
|
+
# 防 agent 经 write_file/edit_file/execute 篡改注入目录。参考 SkillWriteGuard。
|
|
314
|
+
if name in ("write_file", "edit_file"):
|
|
315
|
+
fp = args.get("file_path") if isinstance(args, dict) else ""
|
|
316
|
+
if _is_wl_path(fp):
|
|
317
|
+
return ToolMessage(content=_WL_DENIED_MSG, name=name,
|
|
318
|
+
tool_call_id=tc.get("id", ""), status="error")
|
|
319
|
+
elif name == "execute":
|
|
320
|
+
command = args.get("command", "") if isinstance(args, dict) else ""
|
|
321
|
+
if _command_writes_wl(command):
|
|
322
|
+
return ToolMessage(content=_WL_DENIED_MSG, name="execute",
|
|
323
|
+
tool_call_id=tc.get("id", ""), status="error")
|
|
324
|
+
|
|
325
|
+
if name != "execute":
|
|
199
326
|
return await handler(request)
|
|
200
327
|
|
|
201
|
-
args = tc.get("args", {}) or {}
|
|
202
328
|
command = args.get("command", "") if isinstance(args, dict) else ""
|
|
203
329
|
if not command:
|
|
204
330
|
return await handler(request)
|
{sycommon_python_lib-0.2.7a22 → sycommon_python_lib-0.2.7a23}/src/sycommon/agent/sandbox/file_ops.py
RENAMED
|
@@ -54,6 +54,25 @@ _EDIT_ERROR_CODE_MAP = {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
|
|
57
|
+
# 服务端 /ls 错误码 -> 人类可读文案(对齐 BaseSandbox._parse_ls_output 的
|
|
58
|
+
# path_not_found / not_a_directory 语义)。未在表内的码原样透传。
|
|
59
|
+
_LS_ERROR_MAP = {
|
|
60
|
+
"path_not_found": "path not found",
|
|
61
|
+
"not_a_directory": "not a directory",
|
|
62
|
+
"permission_denied": "permission denied",
|
|
63
|
+
"list_failed": "listing failed",
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# 服务端 /delete 错误码 -> 人类可读文案(统一前缀 "Failed to delete '<path>': ...",
|
|
68
|
+
# 与 write 的 "Failed to write file '<path>': ..." 风格一致)。
|
|
69
|
+
_DELETE_ERROR_MAP = {
|
|
70
|
+
"file_not_found": "file not found",
|
|
71
|
+
"is_directory": "is a directory, set recursive=true",
|
|
72
|
+
"permission_denied": "permission denied",
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
57
76
|
def _normalize_edit_error(error: str, file_path: str, old_string: str) -> str:
|
|
58
77
|
"""把服务端的自由格式错误串映射成与 BaseSandbox 一致的可读消息。
|
|
59
78
|
|
|
@@ -282,7 +301,14 @@ class FileOperationsMixin:
|
|
|
282
301
|
"path": path,
|
|
283
302
|
"user_id": self.user_id
|
|
284
303
|
})
|
|
285
|
-
#
|
|
304
|
+
# 服务端路径不存在/非目录时返回 {"error": "path_not_found"/"not_a_directory"/...}
|
|
305
|
+
# 对齐 BaseSandbox._parse_ls_output,映射成 "Path '<path>': <reason>",
|
|
306
|
+
# 而非当成空目录成功(否则 agent 会误判路径存在但无文件)。
|
|
307
|
+
if isinstance(result, dict) and result.get("error"):
|
|
308
|
+
err = result["error"]
|
|
309
|
+
# 归一化错误码为人类可读文案(对齐 BaseSandbox 的 path_not_found/not_a_directory 语义)
|
|
310
|
+
err_msg = _LS_ERROR_MAP.get(err, err)
|
|
311
|
+
return LsResult(entries=None, error=f"Path '{path}': {err_msg}")
|
|
286
312
|
entries = [FileInfo(**item) for item in (result or [])]
|
|
287
313
|
SYLogger.info(f"[Sandbox] 目录内容: {len(entries)} 项")
|
|
288
314
|
return LsResult(entries=entries)
|
|
@@ -300,6 +326,10 @@ class FileOperationsMixin:
|
|
|
300
326
|
"path": path,
|
|
301
327
|
"user_id": self.user_id
|
|
302
328
|
}, timeout=timeout)
|
|
329
|
+
if isinstance(result, dict) and result.get("error"):
|
|
330
|
+
err = result["error"]
|
|
331
|
+
err_msg = _LS_ERROR_MAP.get(err, err)
|
|
332
|
+
return LsResult(entries=None, error=f"Path '{path}': {err_msg}")
|
|
303
333
|
entries = [FileInfo(**item) for item in (result or [])]
|
|
304
334
|
SYLogger.info(f"[Sandbox] 目录内容: {len(entries)} 项")
|
|
305
335
|
return LsResult(entries=entries)
|
|
@@ -606,7 +636,10 @@ class FileOperationsMixin:
|
|
|
606
636
|
# ============== 树形目录 ==============
|
|
607
637
|
|
|
608
638
|
def tree(self: "HTTPSandboxBackend", path: str = "/", max_depth: int = 30, max_files: int = 0) -> TreeResult:
|
|
609
|
-
"""以树形结构展示目录
|
|
639
|
+
"""以树形结构展示目录
|
|
640
|
+
|
|
641
|
+
错误前缀对齐 read/ls/grep/glob:统一包装为 "Path '<path>': <reason>"。
|
|
642
|
+
"""
|
|
610
643
|
try:
|
|
611
644
|
self._lazy_sync_skill_from_path_sync(path)
|
|
612
645
|
self._ensure_synced_sync()
|
|
@@ -618,13 +651,13 @@ class FileOperationsMixin:
|
|
|
618
651
|
"max_files": max_files,
|
|
619
652
|
})
|
|
620
653
|
if result.get("error"):
|
|
621
|
-
return TreeResult(error=result[
|
|
654
|
+
return TreeResult(error=f"Path '{path}': {result['error']}")
|
|
622
655
|
tree_node = TreeNode(
|
|
623
656
|
**result["tree"]) if result.get("tree") else None
|
|
624
657
|
return TreeResult(tree=tree_node)
|
|
625
658
|
except Exception as e:
|
|
626
659
|
SYLogger.error(f"[Sandbox] tree 失败: {e}")
|
|
627
|
-
return TreeResult(error=
|
|
660
|
+
return TreeResult(error=f"Path '{path}': {e}")
|
|
628
661
|
|
|
629
662
|
async def atree(self: "HTTPSandboxBackend", path: str = "/", max_depth: int = 30, max_files: int = 0, *, timeout: int = None) -> TreeResult:
|
|
630
663
|
"""异步以树形结构展示目录"""
|
|
@@ -639,13 +672,13 @@ class FileOperationsMixin:
|
|
|
639
672
|
"max_files": max_files,
|
|
640
673
|
}, timeout=timeout)
|
|
641
674
|
if result.get("error"):
|
|
642
|
-
return TreeResult(error=result[
|
|
675
|
+
return TreeResult(error=f"Path '{path}': {result['error']}")
|
|
643
676
|
tree_node = TreeNode(
|
|
644
677
|
**result["tree"]) if result.get("tree") else None
|
|
645
678
|
return TreeResult(tree=tree_node)
|
|
646
679
|
except Exception as e:
|
|
647
680
|
SYLogger.error(f"[Sandbox] 异步 tree 失败: {e}")
|
|
648
|
-
return TreeResult(error=
|
|
681
|
+
return TreeResult(error=f"Path '{path}': {e}")
|
|
649
682
|
|
|
650
683
|
def grep(
|
|
651
684
|
self: "HTTPSandboxBackend",
|
|
@@ -745,7 +778,12 @@ class FileOperationsMixin:
|
|
|
745
778
|
path: str,
|
|
746
779
|
recursive: bool = False,
|
|
747
780
|
) -> DeleteResult:
|
|
748
|
-
"""删除文件或文件夹
|
|
781
|
+
"""删除文件或文件夹
|
|
782
|
+
|
|
783
|
+
错误文案对齐 write 的 "Failed to write file '<path>': ..." 风格,
|
|
784
|
+
统一为 "Failed to delete '<path>': <reason>",并把服务端错误码
|
|
785
|
+
归一化(file_not_found / is_directory / permission_denied)。
|
|
786
|
+
"""
|
|
749
787
|
try:
|
|
750
788
|
self._lazy_sync_skill_from_path_sync(path)
|
|
751
789
|
self._ensure_synced_sync()
|
|
@@ -755,18 +793,15 @@ class FileOperationsMixin:
|
|
|
755
793
|
"user_id": self.user_id,
|
|
756
794
|
"recursive": recursive,
|
|
757
795
|
})
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
else:
|
|
765
|
-
SYLogger.info(f"[Sandbox] 删除成功: {delete_result.path}")
|
|
766
|
-
return delete_result
|
|
796
|
+
err = result.get("error")
|
|
797
|
+
if err:
|
|
798
|
+
err_msg = _DELETE_ERROR_MAP.get(err, err)
|
|
799
|
+
return DeleteResult(path=path, error=f"Failed to delete '{path}': {err_msg}")
|
|
800
|
+
SYLogger.info(f"[Sandbox] 删除成功: {result.get('path', path)}")
|
|
801
|
+
return DeleteResult(path=result.get("path", path), error=None)
|
|
767
802
|
except Exception as e:
|
|
768
803
|
SYLogger.error(f"[Sandbox] 删除异常: {e}")
|
|
769
|
-
return DeleteResult(path=path, error=
|
|
804
|
+
return DeleteResult(path=path, error=f"Failed to delete '{path}': {e}")
|
|
770
805
|
|
|
771
806
|
async def adelete(
|
|
772
807
|
self: "HTTPSandboxBackend",
|
|
@@ -780,6 +815,8 @@ class FileOperationsMixin:
|
|
|
780
815
|
|
|
781
816
|
_skip_lazy_sync=True 时跳过懒同步(供内部技能覆盖删除用,
|
|
782
817
|
避免「删之前先把要删的技能上传一遍」的浪费)。
|
|
818
|
+
|
|
819
|
+
错误文案对齐 write/delete:统一 "Failed to delete '<path>': <reason>"。
|
|
783
820
|
"""
|
|
784
821
|
try:
|
|
785
822
|
if not _skip_lazy_sync:
|
|
@@ -791,18 +828,15 @@ class FileOperationsMixin:
|
|
|
791
828
|
"user_id": self.user_id,
|
|
792
829
|
"recursive": recursive,
|
|
793
830
|
}, timeout=timeout)
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
else:
|
|
801
|
-
SYLogger.info(f"[Sandbox] 异步删除成功: {delete_result.path}")
|
|
802
|
-
return delete_result
|
|
831
|
+
err = result.get("error")
|
|
832
|
+
if err:
|
|
833
|
+
err_msg = _DELETE_ERROR_MAP.get(err, err)
|
|
834
|
+
return DeleteResult(path=path, error=f"Failed to delete '{path}': {err_msg}")
|
|
835
|
+
SYLogger.info(f"[Sandbox] 异步删除成功: {result.get('path', path)}")
|
|
836
|
+
return DeleteResult(path=result.get("path", path), error=None)
|
|
803
837
|
except Exception as e:
|
|
804
838
|
SYLogger.error(f"[Sandbox] 异步删除异常: {e}")
|
|
805
|
-
return DeleteResult(path=path, error=
|
|
839
|
+
return DeleteResult(path=path, error=f"Failed to delete '{path}': {e}")
|
|
806
840
|
|
|
807
841
|
# ============== 文件存在检查 ==============
|
|
808
842
|
|
|
@@ -1020,10 +1020,13 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
|
|
|
1020
1020
|
"path": remote_path,
|
|
1021
1021
|
"user_id": self._user_id
|
|
1022
1022
|
}, timeout=timeout)
|
|
1023
|
-
|
|
1024
|
-
|
|
1023
|
+
# /ls 返回可能是 list[FileInfo](成功)或 {"error": ...}(路径不存在)。
|
|
1024
|
+
# 路径不存在时不视为错误——相当于无已有子目录可跳过,走全量同步。
|
|
1025
|
+
items = ls_result if isinstance(ls_result, list) else (ls_result or {}).get("files", [])
|
|
1026
|
+
if ls_result and not (isinstance(ls_result, dict) and ls_result.get("error")):
|
|
1027
|
+
for item in items:
|
|
1025
1028
|
if item.get("is_dir", False):
|
|
1026
|
-
existing_subdirs.add(item.get("name", ""))
|
|
1029
|
+
existing_subdirs.add(item.get("name", item.get("path", "").rstrip("/").split("/")[-1]))
|
|
1027
1030
|
if existing_subdirs:
|
|
1028
1031
|
SYLogger.info(
|
|
1029
1032
|
f"[Sandbox] partial 模式,跳过已有子目录: {existing_subdirs}")
|
|
@@ -1398,10 +1401,12 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
|
|
|
1398
1401
|
"path": remote_path,
|
|
1399
1402
|
"user_id": self._user_id
|
|
1400
1403
|
})
|
|
1401
|
-
|
|
1402
|
-
|
|
1404
|
+
# /ls 成功返回 list[FileInfo],路径不存在返回 {"error":...}(不视为错误,走全量)。
|
|
1405
|
+
items = ls_result if isinstance(ls_result, list) else (ls_result or {}).get("files", [])
|
|
1406
|
+
if ls_result and not (isinstance(ls_result, dict) and ls_result.get("error")):
|
|
1407
|
+
for item in items:
|
|
1403
1408
|
if item.get("is_dir", False):
|
|
1404
|
-
existing_subdirs.add(item.get("name", ""))
|
|
1409
|
+
existing_subdirs.add(item.get("name", item.get("path", "").rstrip("/").split("/")[-1]))
|
|
1405
1410
|
if existing_subdirs:
|
|
1406
1411
|
SYLogger.info(
|
|
1407
1412
|
f"[Sandbox] partial 模式,跳过已有子目录: {existing_subdirs}")
|