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.
Files changed (355) hide show
  1. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/wecom_ldap_service.py +154 -15
  4. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/sandbox.py +9 -2
  5. sycommon_python_lib-0.2.7a56/src/sycommon/tools/user_id.py +106 -0
  6. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  7. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
  8. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/README.md +0 -0
  9. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/setup.cfg +0 -0
  10. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/__init__.py +0 -0
  11. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/cli.py +0 -0
  12. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/core/__init__.py +0 -0
  13. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/core/console.py +0 -0
  14. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/core/models.py +0 -0
  15. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/core/project.py +0 -0
  16. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/core/utils.py +0 -0
  17. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/__init__.py +0 -0
  18. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/README.md.tpl +0 -0
  19. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/__init__.py +0 -0
  20. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  21. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  22. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  23. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  24. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  25. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/api/query.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/app.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/db/service.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/model/parse.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/.env.tpl +0 -0
  41. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/.gitignore.tpl +0 -0
  42. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/Dockerfile.tpl +0 -0
  43. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/README.md.tpl +0 -0
  44. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/__init__.py +0 -0
  45. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/app.py.tpl +0 -0
  46. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/app.yaml.tpl +0 -0
  47. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  48. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/client/__init__.py.tpl +0 -0
  49. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/model/__init__.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/model/file_info.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/base/requirements.txt.tpl +0 -0
  52. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/README.md.tpl +0 -0
  53. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/__init__.py +0 -0
  54. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/app.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  58. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  59. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/README.md.tpl +0 -0
  60. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/__init__.py +0 -0
  61. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/api/__init__.py.tpl +0 -0
  62. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/api/echo.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/app.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/client/__init__.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/model/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/command/templates/web/tools/mq.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/nexus/__init__.py +0 -0
  71. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/__init__.py +0 -0
  72. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/__main__.py +0 -0
  73. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/acp/__init__.py +0 -0
  74. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/acp/config.py +0 -0
  75. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/acp/executor.py +0 -0
  76. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/acp/registry.py +0 -0
  77. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/acp/server.py +0 -0
  78. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/agents/__init__.py +0 -0
  79. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/agents/factory.py +0 -0
  80. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/agents/prompts.py +0 -0
  81. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/__init__.py +0 -0
  82. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/browser.py +0 -0
  83. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/__init__.py +0 -0
  84. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/console.py +0 -0
  85. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/dom.py +0 -0
  86. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/network.py +0 -0
  87. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  88. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/performance.py +0 -0
  89. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  90. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/client.py +0 -0
  91. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/protocol.py +0 -0
  92. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cdp/repl.py +0 -0
  93. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/cli.py +0 -0
  94. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/__init__.py +0 -0
  95. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/acp_cmd.py +0 -0
  96. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/cdp_cmd.py +0 -0
  97. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/chat_cmd.py +0 -0
  98. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/create_cmd.py +0 -0
  99. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/evaluate_cmd.py +0 -0
  100. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/init_cmd.py +0 -0
  101. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/memory_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/resume_cmd.py +0 -0
  103. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/rollback_cmd.py +0 -0
  104. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/commands/run_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/__init__.py +0 -0
  106. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/backend.py +0 -0
  107. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/config.py +0 -0
  108. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/display.py +0 -0
  109. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/git_integration.py +0 -0
  110. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/llm.py +0 -0
  111. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/core/state.py +0 -0
  112. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/evaluate/__init__.py +0 -0
  113. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/evaluate/api_evaluator.py +0 -0
  114. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/__init__.py +0 -0
  115. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/compressor.py +0 -0
  116. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/full.py +0 -0
  117. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/hot.py +0 -0
  118. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/manager.py +0 -0
  119. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/memory/warm.py +0 -0
  120. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/mode/__init__.py +0 -0
  121. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/mode/create.py +0 -0
  122. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/mode/optimize.py +0 -0
  123. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/models/__init__.py +0 -0
  124. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/models/config_models.py +0 -0
  125. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/__init__.py +0 -0
  126. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/baseline_tests.py +0 -0
  127. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/checkpoint.py +0 -0
  128. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/convergence.py +0 -0
  129. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/diagnosis.py +0 -0
  130. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/engine.py +0 -0
  131. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/environment.py +0 -0
  132. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/experience.py +0 -0
  133. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/harness_prompts.py +0 -0
  134. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/history.py +0 -0
  135. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/optimization_logger.py +0 -0
  136. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/pre_validation.py +0 -0
  137. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/reward.py +0 -0
  138. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/strategy_bandit.py +0 -0
  139. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/strategy_generator.py +0 -0
  140. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/rl/strategy_prompts.py +0 -0
  141. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/simple_chat_agent.py +0 -0
  142. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycli/skills/__init__.py +0 -0
  143. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/__init__.py +0 -0
  144. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/__init__.py +0 -0
  145. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/acp/__init__.py +0 -0
  146. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/acp/client.py +0 -0
  147. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/acp/fetch.py +0 -0
  148. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/acp/ssh_init.py +0 -0
  149. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/acp/tool.py +0 -0
  150. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/agent_manager.py +0 -0
  151. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/chat_events.py +0 -0
  152. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/deep_agent.py +0 -0
  153. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/mcp/__init__.py +0 -0
  154. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/mcp/models.py +0 -0
  155. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  156. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/model_request_prep.py +0 -0
  157. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
  158. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  159. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
  160. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
  161. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
  162. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  163. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/multi_agent_team.py +0 -0
  164. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/reasoning_content_patch.py +0 -0
  165. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/resume_compactor.py +0 -0
  166. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/__init__.py +0 -0
  167. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  168. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  169. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  170. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  171. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  172. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  173. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/sandbox/session.py +0 -0
  174. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/agent/summarization_utils.py +0 -0
  175. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/__init__.py +0 -0
  176. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/ldap_service.py +0 -0
  177. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/oa_cache.py +0 -0
  178. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/oa_crypto.py +0 -0
  179. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/auth/oa_service.py +0 -0
  180. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/ACPAgentConfig.py +0 -0
  181. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/Config.py +0 -0
  182. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/DatabaseConfig.py +0 -0
  183. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  184. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/EmbeddingConfig.py +0 -0
  185. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/LLMConfig.py +0 -0
  186. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/LangfuseConfig.py +0 -0
  187. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/MQConfig.py +0 -0
  188. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/PgConfig.py +0 -0
  189. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/RedisConfig.py +0 -0
  190. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/RerankerConfig.py +0 -0
  191. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/SentryConfig.py +0 -0
  192. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
  193. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/XxlJobConfig.py +0 -0
  194. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/__init__.py +0 -0
  195. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/config/config_change_notifier.py +0 -0
  196. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/async_base_db_service.py +0 -0
  197. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/async_database_service.py +0 -0
  198. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/base_db_service.py +0 -0
  199. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/database_service.py +0 -0
  200. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/elasticsearch_service.py +0 -0
  201. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  202. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/redis_service.py +0 -0
  203. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/resilient_pg_saver.py +0 -0
  204. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/database/token_usage_db_service.py +0 -0
  205. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/health/__init__.py +0 -0
  206. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/health/health_check.py +0 -0
  207. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/health/metrics.py +0 -0
  208. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/health/ping.py +0 -0
  209. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/heartbeat_process/__init__.py +0 -0
  210. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  211. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  212. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  213. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/__init__.py +0 -0
  214. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/embedding.py +0 -0
  215. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/get_llm.py +0 -0
  216. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/llm_logger.py +0 -0
  217. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/llm_tokens.py +0 -0
  218. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  219. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  220. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  221. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/struct_token.py +0 -0
  222. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/sy_langfuse.py +0 -0
  223. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  224. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  225. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/token_usage_es_service.py +0 -0
  226. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  227. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/token_utils.py +0 -0
  228. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/llm/usage_token.py +0 -0
  229. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/__init__.py +0 -0
  230. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/async_sql_logger.py +0 -0
  231. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/kafka_log.py +0 -0
  232. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/log_masker.py +0 -0
  233. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/logger_levels.py +0 -0
  234. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/logger_wrapper.py +0 -0
  235. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/process_logger.py +0 -0
  236. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/logging/sql_logger.py +0 -0
  237. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/mcp_server/__init__.py +0 -0
  238. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/mcp_server/server.py +0 -0
  239. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/__init__.py +0 -0
  240. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/context.py +0 -0
  241. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/cors.py +0 -0
  242. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/docs.py +0 -0
  243. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/exception.py +0 -0
  244. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/middleware.py +0 -0
  245. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/monitor_memory.py +0 -0
  246. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/mq.py +0 -0
  247. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/timeout.py +0 -0
  248. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/token_tracking.py +0 -0
  249. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  250. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/middleware/traceid.py +0 -0
  251. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/__init__.py +0 -0
  252. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/base_http.py +0 -0
  253. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/log.py +0 -0
  254. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/mcp_server_config.py +0 -0
  255. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/mqlistener_config.py +0 -0
  256. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/mqmsg_model.py +0 -0
  257. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/mqsend_config.py +0 -0
  258. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/sandbox.py +0 -0
  259. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/sso_user.py +0 -0
  260. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/token_usage.py +0 -0
  261. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/token_usage_mysql.py +0 -0
  262. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/models/xxljob_handler_config.py +0 -0
  263. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/notice/__init__.py +0 -0
  264. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  265. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/notice/wecom_message.py +0 -0
  266. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  267. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  268. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  269. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  270. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  271. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  272. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  273. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  274. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  275. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/sentry/__init__.py +0 -0
  276. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/sentry/sy_sentry.py +0 -0
  277. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/services.py +0 -0
  278. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/sse/__init__.py +0 -0
  279. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/sse/event.py +0 -0
  280. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/sse/sse.py +0 -0
  281. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/__init__.py +0 -0
  282. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/example.py +0 -0
  283. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/example2.py +0 -0
  284. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/feign.py +0 -0
  285. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/feign_client.py +0 -0
  286. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_client_base.py +0 -0
  287. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  288. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  289. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_service.py +0 -0
  290. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  291. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  292. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/synacos/param.py +0 -0
  293. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/deep_agent_server.py +0 -0
  294. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consistent_hash.py +0 -0
  295. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consume_dedup.py +0 -0
  296. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  297. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  298. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consumer_recovery_fix.py +0 -0
  299. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_consumer_tags_sync.py +0 -0
  300. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_deep_agent.py +0 -0
  301. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  302. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_email.py +0 -0
  303. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_encoding_cache.py +0 -0
  304. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -0
  305. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -0
  306. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_fault_injection_real.py +0 -0
  307. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_fix_verification.py +0 -0
  308. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_heartbeat_timeout.py +0 -0
  309. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_integration_real_broker.py +0 -0
  310. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_mcp_server.py +0 -0
  311. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  312. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_mq.py +0 -0
  313. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_mq_config_driven.py +0 -0
  314. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_oa_login.py +0 -0
  315. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  316. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -0
  317. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_real_summarization.py +0 -0
  318. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_reconnect_scenarios.py +0 -0
  319. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_summarization_config.py +0 -0
  320. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_summarization_real.py +0 -0
  321. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  322. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
  323. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
  324. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tests/test_upgrade_verification.py +0 -0
  325. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/__init__.py +0 -0
  326. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/async_utils.py +0 -0
  327. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/docs.py +0 -0
  328. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/env.py +0 -0
  329. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/merge_headers.py +0 -0
  330. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/snowflake.py +0 -0
  331. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/syemail.py +0 -0
  332. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/tools/timing.py +0 -0
  333. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/xxljob/__init__.py +0 -0
  334. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon/xxljob/xxljob_service.py +0 -0
  335. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  336. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  337. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  338. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  339. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_acp_tool.py +0 -0
  340. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_asyncio_logging.py +0 -0
  341. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_config_change_notifier.py +0 -0
  342. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_hotreload_snapshot.py +0 -0
  343. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_llm_apikey_contextvar.py +0 -0
  344. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_log_masker.py +0 -0
  345. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_resilient_pg_saver.py +0 -0
  346. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_sandbox_path_guard.py +0 -0
  347. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_sensitive_guard.py +0 -0
  348. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_simple_chat_agent.py +0 -0
  349. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_skill_regex_upgrade.py +0 -0
  350. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_skill_write_guard.py +0 -0
  351. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_streaming_e2e.py +0 -0
  352. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_sycli.py +0 -0
  353. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_sync_skills_to_sandbox.py +0 -0
  354. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_upload_concurrency.py +0 -0
  355. {sycommon_python_lib-0.2.7a55 → sycommon_python_lib-0.2.7a56}/tests/test_upload_e2e_http.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.7a55
3
+ Version: 0.2.7a56
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.7a55"
3
+ version = "0.2.7a56"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -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
- self.by_cn[cn.lower()] = ldap_user
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
- if chinese_name.lower() in self.by_cn:
169
- return self.by_cn[chinese_name.lower()], "chinese_name"
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
- unified_id = result.ldap_user.username
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. 写入 Redis 缓存(统一小写)
818
- unified_id = unified_id.lower().replace(" ", "")
819
- await self._set_cached_mapping(employee_id, unified_id)
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.lower().replace(" ", "")
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.lower().replace(" ", "")
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)
@@ -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
- return re.sub(r'[^a-zA-Z0-9._\-]', '_', user_id.lower().replace(" ", ""))
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.7a55
3
+ Version: 0.2.7a56
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -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