sycommon-python-lib 0.2.7a55__tar.gz → 0.2.7a56__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.7a55 → sycommon_python_lib-0.2.7a56}/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/pyproject.toml +1 -1
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/wecom_ldap_service.py +154 -15
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/sandbox.py +9 -2
- sycommon_python_lib-0.2.7a56/src/sycommon/tools/user_id.py +106 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/README.md +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/model_request_prep.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/reasoning_content_patch.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/resume_compactor.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consume_dedup.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consumer_recovery_fix.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consumer_tags_sync.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_fault_injection_real.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_heartbeat_timeout.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_integration_real_broker.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_mq_config_driven.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_reconnect_scenarios.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_upgrade_verification.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_streaming_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_sync_skills_to_sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_upload_concurrency.py +0 -0
- {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_upload_e2e_http.py +0 -0
|
@@ -26,6 +26,7 @@ from pydantic import BaseModel
|
|
|
26
26
|
|
|
27
27
|
from sycommon.config.Config import SingletonMeta
|
|
28
28
|
from sycommon.logging.kafka_log import SYLogger
|
|
29
|
+
from sycommon.tools.user_id import normalize_user_id
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
# ─── 模型定义 ───
|
|
@@ -70,6 +71,16 @@ class LDAPFullUser(BaseModel):
|
|
|
70
71
|
ou_chain: List[str] = [] # OU 层级路径
|
|
71
72
|
|
|
72
73
|
|
|
74
|
+
# match_method -> 可信度(越大越可信)。用于域账号冲突时择优保留正确映射。
|
|
75
|
+
# 中文名唯一命中(by_cn len==1)最可信;英文名前缀(by_sam_prefix)最易误命中。
|
|
76
|
+
_MATCH_TRUST: dict = {
|
|
77
|
+
"chinese_name": 30,
|
|
78
|
+
"english_name_surname": 20,
|
|
79
|
+
"english_name_position": 15,
|
|
80
|
+
"english_name": 10,
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
73
84
|
class WeComLDAPUser(BaseModel):
|
|
74
85
|
"""企微-LDAP 关联用户(最终返回结果)"""
|
|
75
86
|
|
|
@@ -92,7 +103,7 @@ class _LDAPIndex:
|
|
|
92
103
|
|
|
93
104
|
def __init__(self):
|
|
94
105
|
# cn(中文名) -> LDAPFullUser
|
|
95
|
-
self.by_cn: Dict[str, LDAPFullUser] =
|
|
106
|
+
self.by_cn: Dict[str, List[LDAPFullUser]] = defaultdict(list)
|
|
96
107
|
# sAMAccountName 前缀(小写) -> [LDAPFullUser]
|
|
97
108
|
self.by_sam_prefix: Dict[str, List[LDAPFullUser]] = defaultdict(list)
|
|
98
109
|
# "en_prefix.sn_pinyin" -> [LDAPFullUser]
|
|
@@ -130,8 +141,9 @@ class _LDAPIndex:
|
|
|
130
141
|
dn=dn or None,
|
|
131
142
|
ou_chain=ou_chain,
|
|
132
143
|
)
|
|
133
|
-
# 中文名 key
|
|
134
|
-
|
|
144
|
+
# 中文名 key 小写化;同名(如两个"张伟"、内地+香港重复账号)保留多候选,
|
|
145
|
+
# 由 lookup 做唯一性校验,避免后写覆盖前写导致同名两人 resolve 到同一域账号串会话。
|
|
146
|
+
self.by_cn[cn.lower()].append(ldap_user)
|
|
135
147
|
|
|
136
148
|
# sAMAccountName 如 "sussie.xia" -> 前缀 "sussie"(小写)
|
|
137
149
|
prefix = sam.split(".")[0].lower()
|
|
@@ -164,9 +176,13 @@ class _LDAPIndex:
|
|
|
164
176
|
Returns:
|
|
165
177
|
(LDAPFullUser | None, match_method | None)
|
|
166
178
|
"""
|
|
167
|
-
#
|
|
168
|
-
|
|
169
|
-
|
|
179
|
+
# 第一优先级:中文名直接匹配(小写化比较)。
|
|
180
|
+
# 🔑 唯一性校验:LDAP 里同名(cn 相同)多人时返回 None,绝不让"后写覆盖前写"
|
|
181
|
+
# 把同名两人 resolve 到同一个域账号——那会导致企微 agent/沙箱/checkpoint 全维度串。
|
|
182
|
+
# 多候选时不命中,由调用方回退到各自原始 wecom_userid(独立、不串)。
|
|
183
|
+
cn_candidates = self.by_cn.get(chinese_name.lower(), [])
|
|
184
|
+
if len(cn_candidates) == 1:
|
|
185
|
+
return cn_candidates[0], "chinese_name"
|
|
170
186
|
|
|
171
187
|
en_first = english_name.lower().split()[0] if english_name else ""
|
|
172
188
|
|
|
@@ -660,12 +676,74 @@ class WeComLDAPService(metaclass=SingletonMeta):
|
|
|
660
676
|
result.employee_id = result.wecom_userid
|
|
661
677
|
results.append(result)
|
|
662
678
|
|
|
679
|
+
# 3. 🔑 全量域账号唯一性校验(根治串会话):
|
|
680
|
+
# 单看每个用户的匹配都没错,但多个企微用户可能因中文名/英文名交叉匹配撞到
|
|
681
|
+
# 同一 LDAP 域账号(实测 Derrick.zhang 被「张仲都」中文名匹配 +「Derrick Du」
|
|
682
|
+
# 英文名匹配同时占用)。扫一遍匹配结果,若同一域账号被 ≥2 个企微用户占用,
|
|
683
|
+
# 把这些人的 matched 全部降级为 False(回退各自工号,独立、不串)。
|
|
684
|
+
self._dedup_ldap_conflicts(results)
|
|
685
|
+
|
|
663
686
|
matched = sum(1 for r in results if r.matched)
|
|
664
687
|
logging.info(
|
|
665
|
-
f"[WeComLDAP] 全量匹配完成: {matched}/{len(results)} 已关联"
|
|
666
|
-
)
|
|
688
|
+
f"[WeComLDAP] 全量匹配完成: {matched}/{len(results)} 已关联")
|
|
667
689
|
return results
|
|
668
690
|
|
|
691
|
+
@staticmethod
|
|
692
|
+
def _dedup_ldap_conflicts(results: List["WeComLDAPUser"]) -> None:
|
|
693
|
+
"""就地消解「同一域账号被多个企微用户占用」的匹配,保证域账号唯一占用。
|
|
694
|
+
|
|
695
|
+
策略:按匹配可信度择优保留,只降级不可信者(而非全部降级)——这样既治串
|
|
696
|
+
(误命中者不再占用别人的域账号),又不误伤正确映射(保企微/Web 沙箱一致)。
|
|
697
|
+
|
|
698
|
+
可信度排序(match_method 决定):
|
|
699
|
+
chinese_name(中文名唯一命中) > english_name_surname(英文名+姓拼音)
|
|
700
|
+
> english_name_position > english_name(英文名前缀,最易误命中)
|
|
701
|
+
冲突组内:保留可信度最高者;若最高者并列(如两人都是中文名,不可能——中文名
|
|
702
|
+
同名已被 by_cn 唯一性校验挡掉)或最高也是低可信(都是 english_name),则全部降级。
|
|
703
|
+
|
|
704
|
+
为什么不全降级:企微与 Web 共用域账号体系,同一人企微/Web userid 必须一致
|
|
705
|
+
(沙箱目录、文件互通)。中文名唯一匹配者几乎确定是真主,降级他会破坏跨端一致性。
|
|
706
|
+
"""
|
|
707
|
+
from collections import defaultdict
|
|
708
|
+
# match_method -> 可信度,复用模块级 _MATCH_TRUST(与 resolve_unified_user_id
|
|
709
|
+
# 单点校验用同一份,避免两条择优路径阈值漂移导致「实时降级、全量保留」抖动)
|
|
710
|
+
TRUST = _MATCH_TRUST
|
|
711
|
+
ldap_to_users: dict = defaultdict(list)
|
|
712
|
+
for r in results:
|
|
713
|
+
if r.matched and r.ldap_user and r.ldap_user.username:
|
|
714
|
+
ldap_to_users[r.ldap_user.username.lower()].append(r)
|
|
715
|
+
for ldap_uname, group in ldap_to_users.items():
|
|
716
|
+
if len(group) <= 1:
|
|
717
|
+
continue
|
|
718
|
+
# 计算每人可信度,找最高
|
|
719
|
+
scored = [(TRUST.get(r.match_method, 0), idx, r)
|
|
720
|
+
for idx, r in enumerate(group)]
|
|
721
|
+
max_trust = max(s[0] for s in scored)
|
|
722
|
+
# 仅当「最高可信者唯一」且「最高可信度 >= chinese_name」才保留它
|
|
723
|
+
# (中文名唯一命中几乎确定真主;英文名前缀即使唯一也不足以独占,全降级)
|
|
724
|
+
winners = [s[2] for s in scored if s[0] == max_trust]
|
|
725
|
+
if len(winners) == 1 and max_trust >= TRUST["chinese_name"]:
|
|
726
|
+
keep = winners[0]
|
|
727
|
+
downgraded = [r for r in group if r is not keep]
|
|
728
|
+
owners = ", ".join(
|
|
729
|
+
f"{r.wecom_userid}({r.wecom_name}/{r.match_method})" for r in group)
|
|
730
|
+
SYLogger.warning(
|
|
731
|
+
f"[WeComLDAP] 🟡域账号冲突择优: ldap={ldap_uname} [{owners}],"
|
|
732
|
+
f"保留可信度最高 {keep.wecom_userid}({keep.match_method}),"
|
|
733
|
+
f"降级其余 {len(downgraded)} 人回退工号")
|
|
734
|
+
else:
|
|
735
|
+
# 最高者并列、或最高也是低可信 → 全部降级(无法判断真主)
|
|
736
|
+
downgraded = list(group)
|
|
737
|
+
owners = ", ".join(
|
|
738
|
+
f"{r.wecom_userid}({r.wecom_name}/{r.match_method})" for r in group)
|
|
739
|
+
SYLogger.warning(
|
|
740
|
+
f"[WeComLDAP] 🔴域账号冲突全降级: ldap={ldap_uname} [{owners}],"
|
|
741
|
+
f"最高可信度={max_trust}不足,全部降级回退工号(不串)")
|
|
742
|
+
for r in downgraded:
|
|
743
|
+
r.matched = False
|
|
744
|
+
r.match_method = None
|
|
745
|
+
r.ldap_user = None
|
|
746
|
+
|
|
669
747
|
async def refresh_cache(self):
|
|
670
748
|
"""手动刷新缓存(access_token + LDAP 索引 + 部门映射)"""
|
|
671
749
|
self._access_token = None
|
|
@@ -732,6 +810,21 @@ class WeComLDAPService(metaclass=SingletonMeta):
|
|
|
732
810
|
pass
|
|
733
811
|
return None
|
|
734
812
|
|
|
813
|
+
async def _get_cached_mapping_reverse(self, unified_id: str) -> Optional[str]:
|
|
814
|
+
"""从 Redis 反查 unified_id(域账号) -> 占用它的 wecom_userid(工号)。
|
|
815
|
+
|
|
816
|
+
用于 resolve_unified_user_id 的域账号唯一性校验:若某域账号已被别的企微工号
|
|
817
|
+
占用,说明多人撞到同一域账号(串会话风险),需降级。
|
|
818
|
+
"""
|
|
819
|
+
try:
|
|
820
|
+
rs = self._get_redis()
|
|
821
|
+
val = await rs.get(f"{self._LDAP_TO_WECOM_PREFIX}{unified_id}")
|
|
822
|
+
if val:
|
|
823
|
+
return val
|
|
824
|
+
except Exception:
|
|
825
|
+
pass
|
|
826
|
+
return None
|
|
827
|
+
|
|
735
828
|
async def _set_cached_mapping(self, wecom_userid: str, unified_id: str):
|
|
736
829
|
"""将 wecom_userid <-> unified_id 双向映射写入 Redis,同时保存工号"""
|
|
737
830
|
try:
|
|
@@ -800,13 +893,17 @@ class WeComLDAPService(metaclass=SingletonMeta):
|
|
|
800
893
|
# 2. 查企微 + LDAP
|
|
801
894
|
unified_id = wecom_userid
|
|
802
895
|
employee_id = wecom_userid # 默认用工号就是原始 userid
|
|
896
|
+
matched_ldap_username = None # 真正匹配到的域账号(用于唯一性校验)
|
|
897
|
+
match_method = None # 匹配方法(决定可信度)
|
|
803
898
|
try:
|
|
804
899
|
result = await self.get_user_info(wecom_userid)
|
|
805
900
|
employee_id = result.wecom_userid # get_user_info 返回解码后的明文工号
|
|
806
901
|
if result.matched and result.ldap_user and result.ldap_user.username:
|
|
807
|
-
|
|
902
|
+
matched_ldap_username = result.ldap_user.username
|
|
903
|
+
match_method = result.match_method
|
|
904
|
+
unified_id = matched_ldap_username
|
|
808
905
|
SYLogger.info(
|
|
809
|
-
f"[WeComLDAP] 用户映射: wecom={wecom_userid} -> ldap={unified_id}")
|
|
906
|
+
f"[WeComLDAP] 用户映射: wecom={wecom_userid} -> ldap={unified_id} ({match_method})")
|
|
810
907
|
else:
|
|
811
908
|
SYLogger.info(
|
|
812
909
|
f"[WeComLDAP] 用户映射: wecom={wecom_userid} -> 未匹配LDAP,回退={unified_id}")
|
|
@@ -814,9 +911,51 @@ class WeComLDAPService(metaclass=SingletonMeta):
|
|
|
814
911
|
SYLogger.warning(
|
|
815
912
|
f"[WeComLDAP] 解析统一 user_id 失败: wecom_userid={wecom_userid}, error={e}")
|
|
816
913
|
|
|
817
|
-
# 3.
|
|
818
|
-
|
|
819
|
-
|
|
914
|
+
# 3. 🔑 域账号唯一性校验(根治串会话,按可信度择优):
|
|
915
|
+
# 多个企微用户可能因中文名/英文名交叉匹配撞到同一域账号。这里在写入缓存前
|
|
916
|
+
# 做反向校验:查 Redis 该域账号是否已被别的企微工号占用。若被占用,按可信度
|
|
917
|
+
# 择优——中文名唯一匹配(最可信)优先保留,英文名前缀(最易误命中)让步降级。
|
|
918
|
+
# 这样既治串又不误伤正确映射(保企微/Web 沙箱一致)。
|
|
919
|
+
if matched_ldap_username:
|
|
920
|
+
normalized_ldap = normalize_user_id(matched_ldap_username)
|
|
921
|
+
owner = await self._get_cached_mapping_reverse(normalized_ldap)
|
|
922
|
+
if owner and owner != employee_id:
|
|
923
|
+
# 该域账号已被别的企微工号占用 → 冲突,按可信度择优
|
|
924
|
+
my_trust = _MATCH_TRUST.get(match_method, 0)
|
|
925
|
+
if my_trust >= _MATCH_TRUST["chinese_name"]:
|
|
926
|
+
# 我是高可信(中文名唯一命中)→ 我才是真主,保留本次映射。
|
|
927
|
+
# 🔑 必须同时 DEL 掉低可信者(owner)残留在 Redis 的【正向】映射
|
|
928
|
+
# wecom_uid_map:{owner}=ldap,否则 owner 下次 resolve 会 L2 正向命中
|
|
929
|
+
# 直接返回 ldap、跳过本段反向校验 → 错误映射存活到次日定时任务才修
|
|
930
|
+
# → 期间两人共享 thread_id 串会话(最长 24h)。删后 owner 下次 L2 miss
|
|
931
|
+
# 走慢路径自查、发现自己被高可信者占用而降级。
|
|
932
|
+
try:
|
|
933
|
+
rs = self._get_redis()
|
|
934
|
+
await rs.delete(f"{self._UID_MAP_PREFIX}{owner}")
|
|
935
|
+
# L1 是进程内、无法跨进程清,但 owner 多半是别的请求/进程;
|
|
936
|
+
# 其 L1 5min TTL 自然过期即可。
|
|
937
|
+
except Exception:
|
|
938
|
+
pass
|
|
939
|
+
SYLogger.warning(
|
|
940
|
+
f"[WeComLDAP] 🟡域账号冲突择优: ldap={normalized_ldap} "
|
|
941
|
+
f"已被 wecom={owner} 占用,但本次 wecom={employee_id} "
|
|
942
|
+
f"可信度更高({match_method}),保留本次映射并清除 {owner} 的正向缓存")
|
|
943
|
+
else:
|
|
944
|
+
# 我是低可信(英文名前缀等)→ 让步降级,回退自己的工号
|
|
945
|
+
SYLogger.warning(
|
|
946
|
+
f"[WeComLDAP] 🔴域账号冲突降级: ldap={normalized_ldap} "
|
|
947
|
+
f"已被 wecom={owner} 占用,本次 wecom={employee_id} "
|
|
948
|
+
f"可信度不足({match_method}),降级回退工号(不串)")
|
|
949
|
+
unified_id = employee_id
|
|
950
|
+
matched_ldap_username = None
|
|
951
|
+
|
|
952
|
+
# 4. 写入 Redis 缓存(统一小写)
|
|
953
|
+
# 降级时不写正向 wecom→ldap(避免错误映射固化),只写 wecom→工号。
|
|
954
|
+
unified_id = normalize_user_id(unified_id)
|
|
955
|
+
if matched_ldap_username:
|
|
956
|
+
await self._set_cached_mapping(employee_id, unified_id)
|
|
957
|
+
else:
|
|
958
|
+
await self._set_cached_mapping(employee_id, employee_id)
|
|
820
959
|
|
|
821
960
|
# 写入 L1
|
|
822
961
|
self._resolve_cache[wecom_userid] = (
|
|
@@ -834,7 +973,7 @@ class WeComLDAPService(metaclass=SingletonMeta):
|
|
|
834
973
|
"""
|
|
835
974
|
try:
|
|
836
975
|
rs = self._get_redis()
|
|
837
|
-
uid = unified_id
|
|
976
|
+
uid = normalize_user_id(unified_id)
|
|
838
977
|
val = await rs.get(f"{self._EMPLOYEE_ID_PREFIX}{uid}")
|
|
839
978
|
if val:
|
|
840
979
|
return val
|
|
@@ -855,7 +994,7 @@ class WeComLDAPService(metaclass=SingletonMeta):
|
|
|
855
994
|
client = rs.get_client()
|
|
856
995
|
async with client.pipeline(transaction=True) as pipe:
|
|
857
996
|
for wecom_userid, unified_id in mapping.items():
|
|
858
|
-
uid = unified_id
|
|
997
|
+
uid = normalize_user_id(unified_id)
|
|
859
998
|
# 正向
|
|
860
999
|
pipe.set(f"{self._UID_MAP_PREFIX}{wecom_userid}",
|
|
861
1000
|
uid, ex=self._MAP_TTL)
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/sandbox.py
RENAMED
|
@@ -443,9 +443,16 @@ cd "$SANDBOX_ROOT"
|
|
|
443
443
|
'''
|
|
444
444
|
|
|
445
445
|
def _sanitize_user_id(user_id: str) -> str:
|
|
446
|
-
"""
|
|
446
|
+
"""将用户名归一化(lower + 去空格)并把其余特殊字符替换为下划线,确保路径安全。
|
|
447
|
+
|
|
448
|
+
用 normalize_user_id 做第一步(与主项目/企微端同一份归一化,保证同一人在
|
|
449
|
+
沙箱侧的工作目录与主项目侧的 user_id 一致 → 企微/Web 沙箱目录互通),
|
|
450
|
+
再把剩余不安全字符替换为下划线。
|
|
451
|
+
"""
|
|
447
452
|
import re
|
|
448
|
-
|
|
453
|
+
from sycommon.tools.user_id import normalize_user_id
|
|
454
|
+
norm = normalize_user_id(user_id)
|
|
455
|
+
return re.sub(r'[^a-zA-Z0-9._\-]', '_', norm)
|
|
449
456
|
|
|
450
457
|
|
|
451
458
|
def get_user_workspace(user_id: str) -> str:
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""用户标识派生(跨服务共享)。
|
|
2
|
+
|
|
3
|
+
本模块是【唯一】的用户标识派生入口,主项目和沙箱项目都必须从这里导入,保证
|
|
4
|
+
同一人在不同服务/不同接口派生出【同一个】标识:
|
|
5
|
+
|
|
6
|
+
- 沙箱目录一致(企微传的文件 Web 能看到,反之亦然)
|
|
7
|
+
- MinIO 对象 key / PG checkpointer thread_id / Redis key 全部一致
|
|
8
|
+
|
|
9
|
+
提供两类标识:
|
|
10
|
+
|
|
11
|
+
1. **常规标识 user_id**(``normalize_user_id``):取自 LDAP 域账号,用于沙箱目录、
|
|
12
|
+
MinIO key、PG thread_id、LLM apiKey、大部分 Redis key。
|
|
13
|
+
规则:``lower()`` + 去全部空格。
|
|
14
|
+
|
|
15
|
+
2. **边界标识 redis_uid**(``redis_uid_from_str`` / ``redis_uid_from_user``):用于
|
|
16
|
+
跨越「登录侧」与「POST /api/token 回调侧」的两个 Redis key ——
|
|
17
|
+
``digital_work:user_token:{redis_uid}`` 和 ``digital_work:pending_auth_retry:{redis_uid}``。
|
|
18
|
+
为什么单独一层:``/api/token`` 是无登录态回调,只能从请求体 email 反推用户
|
|
19
|
+
(``email.split("@")[0]``);而登录侧拿到的是 ``LDAPUser.username``(域账号)。
|
|
20
|
+
两者要落到同一个 Redis key,必须用同一套归一化规则。历史上两边各自写死,靠
|
|
21
|
+
「域账号 == 邮箱本地名」的隐含约定;一旦某员工两者不一致(域账号 ``lisi``、
|
|
22
|
+
邮箱 ``li.si@…``)就断链——token 写到了读侧永远查不到的 key 下,表现为
|
|
23
|
+
「已授权却报未授权」。集中到一处彻底消除该隐含约定。
|
|
24
|
+
"""
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
from typing import Any
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def normalize_user_id(s: str | None) -> str:
|
|
31
|
+
"""把域账号/登录名归一化成统一的 user_id:lower() + 去全部空格。
|
|
32
|
+
|
|
33
|
+
主项目(api/chat.py、files.py、redis_session.py、health.py)与企微
|
|
34
|
+
(wecom_ldap_service.resolve_unified_user_id)都用它,消除各自硬编码
|
|
35
|
+
``.lower().replace(" ","")`` 的散落写法,避免一处漏改导致两端不一致
|
|
36
|
+
→ 沙箱目录错位 → 企微/Web 文件不互通。
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
s: 域账号(sAMAccountName)或登录名,可能带大小写/空格。
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
归一化后的 user_id(小写、无空格);入参为空返回 ``""``。
|
|
43
|
+
"""
|
|
44
|
+
if not s:
|
|
45
|
+
return ""
|
|
46
|
+
return s.lower().replace(" ", "")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def redis_uid_from_str(s: str | None) -> str:
|
|
50
|
+
"""把字符串归一化成边界键用的 redis_uid。
|
|
51
|
+
|
|
52
|
+
规则:取 ``@`` 前的邮箱本地名,再 ``lower()`` + 去空格。
|
|
53
|
+
与 ``POST /api/token`` 写入侧(``email.split("@")[0]``)完全对齐。
|
|
54
|
+
|
|
55
|
+
- ``"Zhang.San@shengye.com"`` → ``"zhang.san"``
|
|
56
|
+
- ``"lisi@shengye.com"`` → ``"lisi"``
|
|
57
|
+
- ``"lisi"``(无 @) → ``"lisi"``(原样归一化)
|
|
58
|
+
- ``""`` / ``None`` → ``""``
|
|
59
|
+
"""
|
|
60
|
+
if not s:
|
|
61
|
+
return ""
|
|
62
|
+
return s.split("@")[0].lower().replace(" ", "")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def redis_uid_from_user(user: Any) -> str:
|
|
66
|
+
"""从 LDAPUser(或带 email/username 属性的对象)派生边界键用的 redis_uid。
|
|
67
|
+
|
|
68
|
+
优先取 ``email`` 的本地名;无 email 时回退 ``username``(= 现状,
|
|
69
|
+
不会比改动前更差——改动前所有读侧本来就用 username)。
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
user: ``sycommon.auth.LDAPUser`` 实例,或 ``None``。
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
归一化后的 redis_uid 字符串;入参为 ``None`` 时返回 ``""``。
|
|
76
|
+
"""
|
|
77
|
+
if user is None:
|
|
78
|
+
return ""
|
|
79
|
+
raw = getattr(user, "email", None) or getattr(user, "username", "") or ""
|
|
80
|
+
return redis_uid_from_str(raw)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def make_thread_id(user_id: str, session_id: str | None) -> str:
|
|
84
|
+
"""构造 LangGraph checkpointer 的 thread_id(Web 端会话隔离核心)。
|
|
85
|
+
|
|
86
|
+
规则:``session_id`` 非空 → ``f"{user_id}:{session_id}"``;为空 → ``user_id``。
|
|
87
|
+
这是 PG checkpoint 表里【唯一】的用户隔离维度(langgraph 按
|
|
88
|
+
``WHERE thread_id = %s`` 读写),两个请求 thread_id 相同 = 共用同一对话历史。
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
user_id: 已归一化的 user_id(``normalize_user_id`` 产物)。
|
|
92
|
+
session_id: 前端会话 ID。为空/None 时退化为单会话模式(thread_id=user_id)。
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
thread_id 字符串。
|
|
96
|
+
|
|
97
|
+
⚠️ 调用方职责:
|
|
98
|
+
- user_id 必须先经 normalize_user_id 归一化(否则大小写/空格漂移会串)。
|
|
99
|
+
- session_id 的唯一性由前端保证;后端不强制,但若前端重复传同一 session_id,
|
|
100
|
+
同一用户的两会话会合并历史(前端 bug 即后端串)。如需更强隔离,可在
|
|
101
|
+
session_id 为空时强制生成 uuid(当前保持「退化为 user_id」的旧行为,不破坏
|
|
102
|
+
既有单会话语义)。
|
|
103
|
+
"""
|
|
104
|
+
if session_id:
|
|
105
|
+
return f"{user_id}:{session_id}"
|
|
106
|
+
return user_id
|
|
@@ -325,6 +325,7 @@ src/sycommon/tools/merge_headers.py
|
|
|
325
325
|
src/sycommon/tools/snowflake.py
|
|
326
326
|
src/sycommon/tools/syemail.py
|
|
327
327
|
src/sycommon/tools/timing.py
|
|
328
|
+
src/sycommon/tools/user_id.py
|
|
328
329
|
src/sycommon/xxljob/__init__.py
|
|
329
330
|
src/sycommon/xxljob/xxljob_service.py
|
|
330
331
|
src/sycommon_python_lib.egg-info/PKG-INFO
|
|
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.7a55 → sycommon_python_lib-0.2.7a56}/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.7a55 → sycommon_python_lib-0.2.7a56}/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.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/.env.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/__init__.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/__init__.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/__init__.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/console.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/dom.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/network.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|