sycommon-python-lib 0.2.7a46__tar.gz → 0.2.7a48__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 (351) hide show
  1. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/pyproject.toml +1 -1
  3. sycommon_python_lib-0.2.7a48/src/sycommon/agent/middleware/sitecustomize.py +300 -0
  4. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/middleware/skill_api_whitelist.py +111 -47
  5. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/auth/ldap_service.py +26 -7
  6. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/rabbitmq/rabbitmq_client.py +75 -6
  7. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/rabbitmq/rabbitmq_pool.py +4 -3
  8. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +27 -4
  9. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +5 -1
  10. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/rabbitmq/rabbitmq_service_core.py +8 -0
  11. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_consume_dedup.py +194 -0
  12. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_consumer_recovery_fix.py +334 -0
  13. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_consumer_tags_sync.py +151 -0
  14. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_exp_concurrent_migrate.py +174 -0
  15. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +145 -0
  16. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_fault_injection_real.py +502 -0
  17. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_heartbeat_timeout.py +282 -0
  18. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_integration_real_broker.py +381 -0
  19. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_mq_config_driven.py +238 -0
  20. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_queue_priority_upgrade_timing.py +257 -0
  21. sycommon_python_lib-0.2.7a48/src/sycommon/tests/test_reconnect_scenarios.py +336 -0
  22. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  23. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon_python_lib.egg-info/SOURCES.txt +11 -0
  24. sycommon_python_lib-0.2.7a46/src/sycommon/agent/middleware/sitecustomize.py +0 -146
  25. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/README.md +0 -0
  26. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/setup.cfg +0 -0
  27. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/__init__.py +0 -0
  28. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/cli.py +0 -0
  29. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/core/__init__.py +0 -0
  30. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/core/console.py +0 -0
  31. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/core/models.py +0 -0
  32. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/core/project.py +0 -0
  33. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/core/utils.py +0 -0
  34. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/__init__.py +0 -0
  35. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/README.md.tpl +0 -0
  36. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/__init__.py +0 -0
  37. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  43. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  44. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/api/query.py.tpl +0 -0
  45. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  46. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  47. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/app.py.tpl +0 -0
  48. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  49. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/db/service.py.tpl +0 -0
  53. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  54. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/model/parse.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/.env.tpl +0 -0
  58. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/.gitignore.tpl +0 -0
  59. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/Dockerfile.tpl +0 -0
  60. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/README.md.tpl +0 -0
  61. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/__init__.py +0 -0
  62. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/app.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/app.yaml.tpl +0 -0
  64. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/client/__init__.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/model/__init__.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/model/file_info.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/base/requirements.txt.tpl +0 -0
  69. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/cli/README.md.tpl +0 -0
  70. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/cli/__init__.py +0 -0
  71. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/cli/app.py.tpl +0 -0
  72. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  73. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  75. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  76. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/README.md.tpl +0 -0
  77. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/__init__.py +0 -0
  78. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/api/__init__.py.tpl +0 -0
  79. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/api/echo.py.tpl +0 -0
  80. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  81. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  82. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/app.py.tpl +0 -0
  83. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/client/__init__.py.tpl +0 -0
  84. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/model/__init__.py.tpl +0 -0
  85. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  86. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/command/templates/web/tools/mq.py.tpl +0 -0
  87. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/nexus/__init__.py +0 -0
  88. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/__init__.py +0 -0
  89. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/__main__.py +0 -0
  90. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/acp/__init__.py +0 -0
  91. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/acp/config.py +0 -0
  92. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/acp/executor.py +0 -0
  93. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/acp/registry.py +0 -0
  94. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/acp/server.py +0 -0
  95. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/agents/__init__.py +0 -0
  96. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/agents/factory.py +0 -0
  97. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/agents/prompts.py +0 -0
  98. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/__init__.py +0 -0
  99. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/browser.py +0 -0
  100. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/capabilities/__init__.py +0 -0
  101. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/capabilities/console.py +0 -0
  102. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/capabilities/dom.py +0 -0
  103. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/capabilities/network.py +0 -0
  104. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  105. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/capabilities/performance.py +0 -0
  106. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  107. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/client.py +0 -0
  108. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/protocol.py +0 -0
  109. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cdp/repl.py +0 -0
  110. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/cli.py +0 -0
  111. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/__init__.py +0 -0
  112. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/acp_cmd.py +0 -0
  113. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/cdp_cmd.py +0 -0
  114. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/chat_cmd.py +0 -0
  115. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/create_cmd.py +0 -0
  116. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/evaluate_cmd.py +0 -0
  117. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/init_cmd.py +0 -0
  118. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/memory_cmd.py +0 -0
  119. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/resume_cmd.py +0 -0
  120. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/rollback_cmd.py +0 -0
  121. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/commands/run_cmd.py +0 -0
  122. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/core/__init__.py +0 -0
  123. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/core/backend.py +0 -0
  124. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/core/config.py +0 -0
  125. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/core/display.py +0 -0
  126. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/core/git_integration.py +0 -0
  127. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/core/llm.py +0 -0
  128. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/core/state.py +0 -0
  129. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/evaluate/__init__.py +0 -0
  130. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/evaluate/api_evaluator.py +0 -0
  131. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/memory/__init__.py +0 -0
  132. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/memory/compressor.py +0 -0
  133. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/memory/full.py +0 -0
  134. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/memory/hot.py +0 -0
  135. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/memory/manager.py +0 -0
  136. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/memory/warm.py +0 -0
  137. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/mode/__init__.py +0 -0
  138. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/mode/create.py +0 -0
  139. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/mode/optimize.py +0 -0
  140. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/models/__init__.py +0 -0
  141. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/models/config_models.py +0 -0
  142. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/__init__.py +0 -0
  143. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/baseline_tests.py +0 -0
  144. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/checkpoint.py +0 -0
  145. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/convergence.py +0 -0
  146. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/diagnosis.py +0 -0
  147. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/engine.py +0 -0
  148. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/environment.py +0 -0
  149. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/experience.py +0 -0
  150. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/harness_prompts.py +0 -0
  151. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/history.py +0 -0
  152. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/optimization_logger.py +0 -0
  153. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/pre_validation.py +0 -0
  154. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/reward.py +0 -0
  155. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/strategy_bandit.py +0 -0
  156. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/strategy_generator.py +0 -0
  157. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/rl/strategy_prompts.py +0 -0
  158. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/simple_chat_agent.py +0 -0
  159. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycli/skills/__init__.py +0 -0
  160. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/__init__.py +0 -0
  161. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/__init__.py +0 -0
  162. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/acp/__init__.py +0 -0
  163. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/acp/client.py +0 -0
  164. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/acp/fetch.py +0 -0
  165. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/acp/ssh_init.py +0 -0
  166. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/acp/tool.py +0 -0
  167. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/agent_manager.py +0 -0
  168. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/chat_events.py +0 -0
  169. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/deep_agent.py +0 -0
  170. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/mcp/__init__.py +0 -0
  171. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/mcp/models.py +0 -0
  172. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  173. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
  174. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  175. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
  176. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  177. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/multi_agent_team.py +0 -0
  178. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/reasoning_content_patch.py +0 -0
  179. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/resume_compactor.py +0 -0
  180. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/sandbox/__init__.py +0 -0
  181. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  182. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  183. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  184. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  185. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  186. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  187. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/sandbox/session.py +0 -0
  188. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/agent/summarization_utils.py +0 -0
  189. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/auth/__init__.py +0 -0
  190. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/auth/oa_cache.py +0 -0
  191. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/auth/oa_crypto.py +0 -0
  192. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/auth/oa_service.py +0 -0
  193. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  194. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/ACPAgentConfig.py +0 -0
  195. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/Config.py +0 -0
  196. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/DatabaseConfig.py +0 -0
  197. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  198. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/EmbeddingConfig.py +0 -0
  199. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/LLMConfig.py +0 -0
  200. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/LangfuseConfig.py +0 -0
  201. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/MQConfig.py +0 -0
  202. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/PgConfig.py +0 -0
  203. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/RedisConfig.py +0 -0
  204. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/RerankerConfig.py +0 -0
  205. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/SentryConfig.py +0 -0
  206. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
  207. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/XxlJobConfig.py +0 -0
  208. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/__init__.py +0 -0
  209. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/config/config_change_notifier.py +0 -0
  210. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/database/async_base_db_service.py +0 -0
  211. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/database/async_database_service.py +0 -0
  212. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/database/base_db_service.py +0 -0
  213. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/database/database_service.py +0 -0
  214. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/database/elasticsearch_service.py +0 -0
  215. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  216. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/database/redis_service.py +0 -0
  217. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/database/resilient_pg_saver.py +0 -0
  218. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/database/token_usage_db_service.py +0 -0
  219. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/health/__init__.py +0 -0
  220. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/health/health_check.py +0 -0
  221. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/health/metrics.py +0 -0
  222. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/health/ping.py +0 -0
  223. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/heartbeat_process/__init__.py +0 -0
  224. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  225. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  226. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  227. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/__init__.py +0 -0
  228. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/embedding.py +0 -0
  229. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/get_llm.py +0 -0
  230. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/llm_logger.py +0 -0
  231. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/llm_tokens.py +0 -0
  232. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  233. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  234. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  235. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/struct_token.py +0 -0
  236. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/sy_langfuse.py +0 -0
  237. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  238. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  239. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/token_usage_es_service.py +0 -0
  240. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  241. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/token_utils.py +0 -0
  242. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/llm/usage_token.py +0 -0
  243. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/logging/__init__.py +0 -0
  244. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/logging/async_sql_logger.py +0 -0
  245. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/logging/kafka_log.py +0 -0
  246. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/logging/log_masker.py +0 -0
  247. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/logging/logger_levels.py +0 -0
  248. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/logging/logger_wrapper.py +0 -0
  249. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/logging/process_logger.py +0 -0
  250. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/logging/sql_logger.py +0 -0
  251. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/mcp_server/__init__.py +0 -0
  252. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/mcp_server/server.py +0 -0
  253. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/__init__.py +0 -0
  254. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/context.py +0 -0
  255. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/cors.py +0 -0
  256. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/docs.py +0 -0
  257. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/exception.py +0 -0
  258. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/middleware.py +0 -0
  259. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/monitor_memory.py +0 -0
  260. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/mq.py +0 -0
  261. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/sandbox.py +0 -0
  262. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/timeout.py +0 -0
  263. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/token_tracking.py +0 -0
  264. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  265. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/middleware/traceid.py +0 -0
  266. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/__init__.py +0 -0
  267. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/base_http.py +0 -0
  268. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/log.py +0 -0
  269. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/mcp_server_config.py +0 -0
  270. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/mqlistener_config.py +0 -0
  271. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/mqmsg_model.py +0 -0
  272. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/mqsend_config.py +0 -0
  273. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/sandbox.py +0 -0
  274. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/sso_user.py +0 -0
  275. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/token_usage.py +0 -0
  276. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/token_usage_mysql.py +0 -0
  277. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/models/xxljob_handler_config.py +0 -0
  278. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/notice/__init__.py +0 -0
  279. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  280. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/notice/wecom_message.py +0 -0
  281. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  282. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  283. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  284. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  285. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/sentry/__init__.py +0 -0
  286. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/sentry/sy_sentry.py +0 -0
  287. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/services.py +0 -0
  288. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/sse/__init__.py +0 -0
  289. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/sse/event.py +0 -0
  290. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/sse/sse.py +0 -0
  291. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/__init__.py +0 -0
  292. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/example.py +0 -0
  293. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/example2.py +0 -0
  294. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/feign.py +0 -0
  295. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/feign_client.py +0 -0
  296. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/nacos_client_base.py +0 -0
  297. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  298. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  299. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/nacos_service.py +0 -0
  300. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  301. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  302. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/synacos/param.py +0 -0
  303. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/deep_agent_server.py +0 -0
  304. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_consistent_hash.py +0 -0
  305. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  306. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  307. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_deep_agent.py +0 -0
  308. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  309. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_email.py +0 -0
  310. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_encoding_cache.py +0 -0
  311. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_fix_verification.py +0 -0
  312. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_mcp_server.py +0 -0
  313. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  314. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_mq.py +0 -0
  315. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_oa_login.py +0 -0
  316. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  317. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_real_summarization.py +0 -0
  318. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_summarization_config.py +0 -0
  319. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_summarization_real.py +0 -0
  320. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  321. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
  322. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
  323. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tests/test_upgrade_verification.py +0 -0
  324. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tools/__init__.py +0 -0
  325. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tools/async_utils.py +0 -0
  326. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tools/docs.py +0 -0
  327. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tools/env.py +0 -0
  328. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tools/merge_headers.py +0 -0
  329. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tools/snowflake.py +0 -0
  330. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tools/syemail.py +0 -0
  331. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/tools/timing.py +0 -0
  332. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/xxljob/__init__.py +0 -0
  333. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon/xxljob/xxljob_service.py +0 -0
  334. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  335. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  336. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  337. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  338. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_acp_tool.py +0 -0
  339. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_asyncio_logging.py +0 -0
  340. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_config_change_notifier.py +0 -0
  341. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_hotreload_snapshot.py +0 -0
  342. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_llm_apikey_contextvar.py +0 -0
  343. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_log_masker.py +0 -0
  344. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_resilient_pg_saver.py +0 -0
  345. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_sandbox_path_guard.py +0 -0
  346. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_sensitive_guard.py +0 -0
  347. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_simple_chat_agent.py +0 -0
  348. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_skill_regex_upgrade.py +0 -0
  349. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_skill_write_guard.py +0 -0
  350. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_sycli.py +0 -0
  351. {sycommon_python_lib-0.2.7a46 → sycommon_python_lib-0.2.7a48}/tests/test_sync_skills_to_sandbox.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.7a46
3
+ Version: 0.2.7a48
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.7a46"
3
+ version = "0.2.7a48"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -0,0 +1,300 @@
1
+ """技能接口白名单客户端注入脚本(部署到沙箱 site-packages)。
2
+
3
+ Python 解释器启动时(未传 -S)自动 import 本模块。它负责 Python HTTP 库的
4
+ 请求拦截:
5
+
6
+ 1. 读环境变量 SKILL_API_WHITELIST(JSON)。无此 env → 不管控(全放行,fail-open)。
7
+ 2. monkeypatch urllib / httpx / requests / aiohttp,发请求前做 path 级前缀匹配,
8
+ 未命中抛 PermissionError(LLM 能看到清晰错误)。
9
+
10
+ ⚠️ shell 命令(curl/wget 等)的拦截【不】在本文件处理——sitecustomize 只在
11
+ `python` 启动时执行,纯 shell 命令不会触发它。shell 拦截由主进程中间件把
12
+ curl/wget 包装函数【内联】到每条 execute 命令前缀实现(见 skill_api_whitelist.py)。
13
+
14
+ URL 匹配核心逻辑复用同目录 skill_wl_check.py。
15
+
16
+ 另外提供【独立于白名单】的 header 注入:当环境变量 SYT_API_AUTHZ 非空时,
17
+ 对 host 命中 SYT_BASE_URL 的请求自动补 X-Sy-Api-Authz 头。这是云平台网关的
18
+ 鉴权要求,对所有沙箱技能请求生效(不门控白名单),由中间件无条件 export
19
+ SYT_API_AUTHZ + 推送本 sitecustomize 触发。
20
+
21
+ 注意:本模块在沙箱子进程里运行,不依赖主进程内存。配置全部来自环境变量。
22
+ """
23
+
24
+ import json
25
+ import os
26
+ import sys
27
+ from urllib.parse import urlparse
28
+
29
+ # SKILL_API_WHITELIST 存在即「启用管控」;allowlist 为空时「全拦截」。
30
+ _ENABLED = "SKILL_API_WHITELIST" in os.environ
31
+
32
+ # 把沙箱 site-packages 里存放本模块的目录加入 sys.path,以便 import skill_wl_check。
33
+ _HERE = os.path.dirname(os.path.abspath(__file__))
34
+ if _HERE not in sys.path:
35
+ sys.path.insert(0, _HERE)
36
+
37
+
38
+ def _load_check():
39
+ """加载同目录 skill_wl_check,返回其 match 函数;失败返回 None。"""
40
+ try:
41
+ import skill_wl_check # type: ignore
42
+ return skill_wl_check
43
+ except Exception as e: # pragma: no cover
44
+ sys.stderr.write("[sitecustomize] 加载 skill_wl_check 失败,白名单禁用: %s\n" % e)
45
+ return None
46
+
47
+
48
+ def _patch_urllib(match):
49
+ import urllib.request
50
+
51
+ _orig = urllib.request.urlopen
52
+
53
+ def _urlopen(url, *args, **kwargs):
54
+ actual = url.full_url if isinstance(url, urllib.request.Request) else url
55
+ if actual and not match(str(actual)):
56
+ raise PermissionError(
57
+ "[SkillApiWhitelist] 拦截: URL 不在白名单内 (urlopen, %s)" % actual)
58
+ return _orig(url, *args, **kwargs)
59
+
60
+ urllib.request.urlopen = _urlopen
61
+
62
+
63
+ def _patch_httpx(match):
64
+ try:
65
+ import httpx
66
+ except ImportError:
67
+ return
68
+
69
+ _orig_sync = httpx.Client.send
70
+
71
+ def _send(self, request, **kwargs):
72
+ if not match(str(request.url)):
73
+ raise PermissionError(
74
+ "[SkillApiWhitelist] 拦截: URL 不在白名单内 (httpx, %s)" % request.url)
75
+ return _orig_sync(self, request, **kwargs)
76
+
77
+ httpx.Client.send = _send
78
+
79
+ if hasattr(httpx, "AsyncClient"):
80
+ _orig_async = httpx.AsyncClient.send
81
+
82
+ async def _asend(self, request, **kwargs):
83
+ if not match(str(request.url)):
84
+ raise PermissionError(
85
+ "[SkillApiWhitelist] 拦截: URL 不在白名单内 (httpx.async, %s)" % request.url)
86
+ return await _orig_async(self, request, **kwargs)
87
+
88
+ httpx.AsyncClient.send = _asend
89
+
90
+
91
+ def _patch_requests(match):
92
+ try:
93
+ import requests
94
+ except ImportError:
95
+ return
96
+
97
+ _orig = requests.Session.request
98
+
99
+ def _request(self, method, url, *args, **kwargs):
100
+ if not match(str(url)):
101
+ raise PermissionError(
102
+ "[SkillApiWhitelist] 拦截: URL 不在白名单内 (requests %s, %s)"
103
+ % (method.upper(), url))
104
+ return _orig(self, method, url, *args, **kwargs)
105
+
106
+ requests.Session.request = _request
107
+
108
+
109
+ def _patch_aiohttp(match):
110
+ try:
111
+ import aiohttp
112
+ except ImportError:
113
+ return
114
+ if not hasattr(aiohttp.ClientSession, "_request"):
115
+ return
116
+
117
+ _orig = aiohttp.ClientSession._request
118
+
119
+ async def _request(self, method, str_or_url, **kwargs):
120
+ if not match(str(str_or_url)):
121
+ raise PermissionError(
122
+ "[SkillApiWhitelist] 拦截: URL 不在白名单内 (aiohttp %s, %s)"
123
+ % (method, str_or_url))
124
+ return await _orig(self, method, str_or_url, **kwargs)
125
+
126
+ aiohttp.ClientSession._request = _request
127
+
128
+
129
+ # =============== header 注入(独立于白名单)===============
130
+ # 云平台网关要求请求带 X-Sy-Api-Authz 头。仅当 host 命中 SYT_BASE_URL 的 host
131
+ # 才补该头,其它域名(内网 OCR / 企微 / 合同比对内网 / MCP 后端等)不注入。
132
+ # 门控:环境变量 SYT_API_AUTHZ 非空。调用方已显式设过同名头则不覆盖。
133
+
134
+ _AUTHZ_HEADER = "X-Sy-Api-Authz"
135
+
136
+
137
+ def _syt_host():
138
+ """解析 SYT_BASE_URL 的 host(小写)。失败返回 None。"""
139
+ base = os.environ.get("SYT_BASE_URL", "").strip()
140
+ if not base:
141
+ return None
142
+ try:
143
+ return (urlparse(base).hostname or "").lower() or None
144
+ except Exception:
145
+ return None
146
+
147
+
148
+ def _host_matches_syt(url) -> bool:
149
+ """请求 URL 的 host 是否等于 SYT_BASE_URL 的 host。"""
150
+ host = _syt_host()
151
+ if not host:
152
+ return False
153
+ try:
154
+ return (urlparse(str(url)).hostname or "").lower() == host
155
+ except Exception:
156
+ return False
157
+
158
+
159
+ def _patch_urllib_hdr():
160
+ import urllib.request
161
+
162
+ _orig = urllib.request.urlopen
163
+
164
+ def _urlopen(url, *args, **kwargs):
165
+ # 只能给 Request 对象补头;裸 str URL 在 urlopen 层无 headers 概念,跳过
166
+ if isinstance(url, urllib.request.Request) and _host_matches_syt(url.full_url):
167
+ url.add_header(_AUTHZ_HEADER, os.environ["SYT_API_AUTHZ"])
168
+ return _orig(url, *args, **kwargs)
169
+
170
+ urllib.request.urlopen = _urlopen
171
+
172
+
173
+ def _patch_requests_hdr():
174
+ try:
175
+ import requests
176
+ except ImportError:
177
+ return
178
+
179
+ _orig = requests.Session.request
180
+
181
+ def _request(self, method, url, *args, **kwargs):
182
+ if _host_matches_syt(url):
183
+ headers = kwargs.get("headers")
184
+ if headers is None:
185
+ headers = {}
186
+ if isinstance(headers, dict):
187
+ if _AUTHZ_HEADER not in headers:
188
+ headers[_AUTHZ_HEADER] = os.environ["SYT_API_AUTHZ"]
189
+ kwargs["headers"] = headers
190
+ else:
191
+ # list / 其它形态:保守起见交给底层,避免破坏既有结构
192
+ pass
193
+ return _orig(self, method, url, *args, **kwargs)
194
+
195
+ requests.Session.request = _request
196
+
197
+
198
+ def _patch_httpx_hdr():
199
+ try:
200
+ import httpx
201
+ except ImportError:
202
+ return
203
+
204
+ def _apply(request):
205
+ if request is not None and _host_matches_syt(request.url):
206
+ request.headers.setdefault(_AUTHZ_HEADER, os.environ["SYT_API_AUTHZ"])
207
+
208
+ _orig_sync = httpx.Client.send
209
+
210
+ def _send(self, request, **kwargs):
211
+ _apply(request)
212
+ return _orig_sync(self, request, **kwargs)
213
+
214
+ httpx.Client.send = _send
215
+
216
+ if hasattr(httpx, "AsyncClient"):
217
+ _orig_async = httpx.AsyncClient.send
218
+
219
+ async def _asend(self, request, **kwargs):
220
+ _apply(request)
221
+ return await _orig_async(self, request, **kwargs)
222
+
223
+ httpx.AsyncClient.send = _asend
224
+
225
+
226
+ def _patch_aiohttp_hdr():
227
+ try:
228
+ import aiohttp
229
+ except ImportError:
230
+ return
231
+ if not hasattr(aiohttp.ClientSession, "_request"):
232
+ return
233
+
234
+ _orig = aiohttp.ClientSession._request
235
+
236
+ async def _request(self, method, str_or_url, **kwargs):
237
+ if _host_matches_syt(str_or_url):
238
+ headers = kwargs.get("headers")
239
+ if isinstance(headers, dict):
240
+ if _AUTHZ_HEADER not in headers:
241
+ headers[_AUTHZ_HEADER] = os.environ["SYT_API_AUTHZ"]
242
+ elif headers is None:
243
+ kwargs["headers"] = {_AUTHZ_HEADER: os.environ["SYT_API_AUTHZ"]}
244
+ else:
245
+ # list / CIMultiDict 等其它形态:跳过,避免破坏结构
246
+ pass
247
+ return await _orig(self, method, str_or_url, **kwargs)
248
+
249
+ aiohttp.ClientSession._request = _request
250
+
251
+
252
+ def _install_header_injection():
253
+ """装 header 注入 patch(独立于白名单)。
254
+
255
+ 门控:环境变量 SYT_API_AUTHZ 非空。任一库 import 失败都不阻断。
256
+ """
257
+ val = os.environ.get("SYT_API_AUTHZ", "").strip()
258
+ if not val:
259
+ return
260
+ if not _syt_host():
261
+ sys.stderr.write(
262
+ "[sitecustomize] SYT_API_AUTHZ 已设置但 SYT_BASE_URL 无法解析 host,"
263
+ "跳过 header 注入\n")
264
+ return
265
+ _patch_urllib_hdr()
266
+ _patch_requests_hdr()
267
+ _patch_httpx_hdr()
268
+ _patch_aiohttp_hdr()
269
+
270
+
271
+ def _install():
272
+ if not _ENABLED:
273
+ return
274
+ check = _load_check()
275
+ if check is None:
276
+ return
277
+ # allowlist 为空(明确禁止)时也走校验——match 必然 False,从而全拦截。
278
+ match = check.match
279
+ _patch_urllib(match)
280
+ _patch_httpx(match)
281
+ _patch_requests(match)
282
+ _patch_aiohttp(match)
283
+
284
+
285
+ # 保留解析结果(供排查)
286
+ try:
287
+ _WHITELIST_RAW = json.loads(os.environ.get("SKILL_API_WHITELIST", "{}"))
288
+ except Exception:
289
+ _WHITELIST_RAW = {}
290
+
291
+ try:
292
+ _install()
293
+ except Exception as _e: # 任何 patch 失败都不能阻断进程启动
294
+ sys.stderr.write("[sitecustomize] 白名单安装失败(fail-open): %s\n" % _e)
295
+
296
+ # header 注入独立于白名单,单独 try/except,互不影响
297
+ try:
298
+ _install_header_injection()
299
+ except Exception as _e:
300
+ sys.stderr.write("[sitecustomize] header 注入安装失败(fail-open): %s\n" % _e)
@@ -26,6 +26,7 @@ import os
26
26
  import re
27
27
  import shlex
28
28
  from typing import Optional
29
+ from urllib.parse import urlparse
29
30
 
30
31
  from langchain.agents.middleware.types import AgentMiddleware
31
32
  from langchain_core.messages import ToolMessage
@@ -35,12 +36,17 @@ from sycommon.logging.kafka_log import SYLogger
35
36
 
36
37
  # 命令路径形如 skills/system/sy-oa-skill/workflow-todo/scripts/x.py
37
38
  # skills/user/sy-oa-skill/SKILL.md
38
- # 拆为 system/user/shengye-platform 多层后,顶层段是 system|user|shengye-platform,
39
- # 需跳过它取【第二段】作域级技能名(如 sy-oa-skill / oa),配合 SkillApiWhitelist
40
- # 按顶级域配置。(?<![\w]) 否定左查找:要求 skills 前不是单词字符,避免误匹配 myskills/。
39
+ # _SKILL_TOP_RE:白名单配置提取用——限定 system|user|shengye-platform 三层后取第二段
40
+ # 作域级技能名(如 sy-oa-skill / oa),配合 SkillApiWhitelist 按顶级域配置。
41
+ # (?<![\w]) 否定左查找:要求 skills 前不是单词字符,避免误匹配 myskills/。
41
42
  _SKILL_TOP_RE = re.compile(
42
43
  r'(?<![\w])skills/(?:system|user|shengye-platform)/([A-Za-z0-9_\-]+)(?:/|$)')
43
44
 
45
+ # _SKILL_ANY_RE:技能命令判定用(宽松)——匹配任意 skills/<...>/ 前缀。
46
+ # 用于 header 注入等对所有技能命令(含用户自行拷贝到非 system 目录的技能)生效的能力,
47
+ # 与白名单配置是否启用解耦。同样 (?<![\w]) 避免误匹配 myskills/。
48
+ _SKILL_ANY_RE = re.compile(r'(?<![\w])skills/[A-Za-z0-9_\-]+(?:/|$)')
49
+
44
50
  # BASE_URL 占位符 ${VAR}
45
51
  _PLACEHOLDER_RE = re.compile(r'\$\{([A-Z_][A-Z0-9_]*)\}')
46
52
 
@@ -167,26 +173,51 @@ def _load_resource_bytes(filename: str) -> bytes:
167
173
  f"读取注入脚本 {filename} 失败,请确认已随包安装(package_data): {e}") from e
168
174
 
169
175
 
170
- def _build_shell_guard() -> str:
176
+ def _build_shell_guard(with_whitelist: bool = False,
177
+ with_header: bool = False) -> str:
171
178
  """生成内联到命令前缀的 curl/wget 包装函数(shell)。
172
179
 
173
- SKILL_API_WHITELIST export 的命令里生效:调用 curl/wget 前先抽取
174
- 参数里首个 http(s) URL,用沙箱 python3 调 skill_wl_check.match 校验,
175
- 未命中则 return 1 拦截。skill_wl_check sitecustomize 同处 site-packages,
176
- python3 启动时 sitecustomize import 它并把该目录加入 sys.path。
180
+ 抽取参数里【最后一个】 http(s) URL _u,按需承担两类职责(可同时启用,
181
+ 先白名单校验、再注入 header):
182
+ - with_whitelist:用沙箱 python3 skill_wl_check.match 校验 _u,未命中 return 1。
183
+ - with_header:_u host 命中 $__SYT_HOST__ 时追加 -H "X-Sy-Api-Authz:
184
+ $SYT_API_AUTHZ"(原参数已含同名头则不重复加)。
177
185
 
178
- 覆盖 curl / wget;其它 shell 出网方式(nc/裸 /dev/tcp 等)不覆盖。
186
+ skill_wl_check sitecustomize 同处 site-packages,python3 启动时 sitecustomize
187
+ 会 import 它并把该目录加入 sys.path。覆盖 curl / wget;其它 shell 出网方式
188
+ (nc/裸 /dev/tcp 等)不覆盖。
179
189
  """
180
- check_cmd = (
181
- 'python3 -c \'import skill_wl_check,sys; '
182
- 'sys.exit(0 if skill_wl_check.match(sys.argv[1]) else 1)\' "$_u"'
183
- )
184
- # 单个命令的函数体模板:抽取 URL 校验 → 通过则 command <CMD> "$@"
190
+ wl_block = ""
191
+ if with_whitelist:
192
+ check_cmd = (
193
+ 'python3 -c \'import skill_wl_check,sys; '
194
+ 'sys.exit(0 if skill_wl_check.match(sys.argv[1]) else 1)\' "$_u"'
195
+ )
196
+ wl_block = (
197
+ f'if [ -n "$_u" ] && ! {check_cmd}; then '
198
+ 'echo "[SkillApiWhitelist] 拦截 shell 请求: $_u" 1>&2; return 1; fi; '
199
+ )
200
+ hdr_block = ""
201
+ if with_header:
202
+ # 从 _u 取 host(小写):剥 scheme/path/query/fragment/userinfo/port
203
+ hdr_block = (
204
+ 'if [ -n "$_u" ] && [ -n "$__SYT_HOST__" ] && [ -n "$SYT_API_AUTHZ" ]; then '
205
+ '_h="${_u#*://}"; _h="${_h%%/*}"; _h="${_h%%\\?*}"; _h="${_h%%#*}"; '
206
+ '_h="${_h##*@}"; _h="${_h%%:*}"; '
207
+ 'case "$(printf "%s" "$_h" | tr "A-Z" "a-z")" in '
208
+ '"$__SYT_HOST__") '
209
+ 'case " $* " in *"X-Sy-Api-Authz"*) :;; *) '
210
+ 'set -- "$@" -H "X-Sy-Api-Authz: $SYT_API_AUTHZ";; '
211
+ 'esac;; '
212
+ 'esac; '
213
+ 'fi; '
214
+ )
215
+ if not wl_block and not hdr_block:
216
+ return ""
185
217
  body = (
186
- '() { local _u; for _a in "$@"; do '
218
+ '() { local _u _a _h; for _a in "$@"; do '
187
219
  'case "$_a" in http://*|https://*) _u="$_a";; esac; done; '
188
- f'if [ -n "$_u" ] && ! {check_cmd}; then '
189
- 'echo "[SkillApiWhitelist] 拦截 shell 请求: $_u" 1>&2; return 1; fi; '
220
+ + wl_block + hdr_block +
190
221
  'command {CMD} "$@"; };'
191
222
  )
192
223
  guard = "curl" + body.replace("{CMD}", "curl") + " wget" + body.replace("{CMD}", "wget")
@@ -329,42 +360,69 @@ class SkillApiWhitelistMiddleware(AgentMiddleware):
329
360
  if not command:
330
361
  return await handler(request)
331
362
 
332
- skill_name = self._extract_skill_name(command)
333
- if skill_name is None:
334
- # 非技能命令(无 skills/<顶级技能>/)→ 不管控
363
+ # 技能命令判定(宽松):任意 skills/.../ 前缀即算(含用户拷贝到非 system
364
+ # 目录的技能)。header 注入等对所有技能命令生效的能力以此为门控。
365
+ if not _SKILL_ANY_RE.search(command):
366
+ # 非技能命令 → 不注入任何前缀
335
367
  return await handler(request)
336
368
 
337
- # 延迟导入避免模块加载期循环依赖
369
+ # 白名单配置提取(限定三层后取第二段)
370
+ skill_name = self._extract_skill_name(command)
338
371
  from sycommon.config.SkillApiWhitelistConfig import SkillApiWhitelistConfig
339
- cfg = SkillApiWhitelistConfig.from_config(skill_name)
340
- if cfg is None or not cfg.enabled:
341
- # 未配置 / 禁用 → 全放行(向后兼容)
342
- return await handler(request)
372
+ cfg = (SkillApiWhitelistConfig.from_config(skill_name)
373
+ if skill_name is not None else None)
374
+ whitelist_on = bool(cfg and cfg.enabled)
343
375
 
344
376
  # 主进程解析占位符 ${VAR}(数据源:os.environ + sandbox env 字典)
345
377
  env_lookup = self._env_lookup()
346
378
  resolved = []
347
- for pat in cfg.allowlist:
348
- if "${" in pat:
349
- expanded = _resolve_placeholders(pat, env_lookup)
350
- if expanded:
351
- resolved.append(expanded)
352
- else:
353
- resolved.append(pat)
354
-
355
- # 推送注入脚本(惰性,每后端实例一次)
356
- await self._ensure_sitecustomize()
357
-
358
- # 序列化白名单 + PYTHONPATH(shell 启动 python 时自动 import sitecustomize)
359
- # + shell guard(curl/wget 拦截) + export SKILL_API_WHITELIST
360
- payload = json.dumps({"skill": skill_name, "allowlist": resolved},
361
- ensure_ascii=False)
362
- guard = _build_shell_guard()
363
- prefix_parts = [
364
- f"export SKILL_API_WHITELIST={shlex.quote(payload)}",
365
- f'export PYTHONPATH="{_WL_DIR}:$PYTHONPATH"',
366
- guard,
367
- ]
379
+ if whitelist_on:
380
+ for pat in cfg.allowlist:
381
+ if "${" in pat:
382
+ expanded = _resolve_placeholders(pat, env_lookup)
383
+ if expanded:
384
+ resolved.append(expanded)
385
+ else:
386
+ resolved.append(pat)
387
+
388
+ # header 注入所需:SYT_API_AUTHZ(缺则不注入)+ SYT_BASE_URL 的 host
389
+ syt_authz = env_lookup("SYT_API_AUTHZ")
390
+ header_on = bool(syt_authz and syt_authz.strip())
391
+ syt_host = ""
392
+ if header_on:
393
+ syt_base = env_lookup("SYT_BASE_URL") or ""
394
+ try:
395
+ syt_host = (urlparse(syt_base).hostname or "").lower()
396
+ except Exception:
397
+ syt_host = ""
398
+ header_on = bool(syt_host)
399
+
400
+ # 推送注入脚本(惰性,每后端实例一次)。
401
+ # 只要【白名单 或 header 注入】任一启用就要推 .wl(sitecustomize)。
402
+ if whitelist_on or header_on:
403
+ await self._ensure_sitecustomize()
404
+
405
+ # 组装命令前缀
406
+ prefix_parts: list[str] = []
407
+ if whitelist_on:
408
+ payload = json.dumps({"skill": skill_name, "allowlist": resolved},
409
+ ensure_ascii=False)
410
+ prefix_parts.append(f"export SKILL_API_WHITELIST={shlex.quote(payload)}")
411
+ if header_on:
412
+ prefix_parts.append(
413
+ f"export SYT_API_AUTHZ={shlex.quote(syt_authz)}")
414
+ prefix_parts.append(f'export __SYT_HOST__={shlex.quote(syt_host)}')
415
+ if whitelist_on or header_on:
416
+ # PYTHONPATH(shell 启动 python 时自动 import sitecustomize)
417
+ prefix_parts.append(f'export PYTHONPATH="{_WL_DIR}:$PYTHONPATH"')
418
+ guard = _build_shell_guard(with_whitelist=whitelist_on,
419
+ with_header=header_on)
420
+ if guard:
421
+ prefix_parts.append(guard)
422
+
423
+ if not prefix_parts:
424
+ return await handler(request)
425
+
368
426
  # 每个 part 之间用 '; ' 分隔(而非空格)—— export 语句之间、函数定义与后续命令
369
427
  # 之间都需要语句分隔符;末尾留一个 ';' 与原命令隔开。
370
428
  prefix = "; ".join(prefix_parts) + "; "
@@ -372,5 +430,11 @@ class SkillApiWhitelistMiddleware(AgentMiddleware):
372
430
  new_command = prefix + command
373
431
  new_args = {**args, "command": new_command} if isinstance(args, dict) else args
374
432
  new_tc = {**tc, "args": new_args}
375
- SYLogger.info("[Whitelist] 注入子技能 %s 白名单(%d 条)", skill_name, len(resolved))
433
+ tags = []
434
+ if whitelist_on:
435
+ tags.append(f"白名单({len(resolved)}条)")
436
+ if header_on:
437
+ tags.append("Authz头注入")
438
+ SYLogger.info("[Whitelist] 技能 %s 注入: %s", skill_name or "<user>",
439
+ "+".join(tags) if tags else "(空)")
376
440
  return await handler(request.override(tool_call=new_tc))
@@ -126,7 +126,9 @@ class LDAPAuthService:
126
126
  user_dn = self._build_user_dn(username)
127
127
 
128
128
  # 尝试连接各个 LDAP 服务器
129
- last_error = None
129
+ # 优先返回认证类错误(invalidCredentials 等),而非连接类错误(timeout)。
130
+ # 避免备用服务器连接超时覆盖了主服务器的真实认证错误(密码错误),误导用户。
131
+ errors = []
130
132
  for url in self.config.urls:
131
133
  try:
132
134
  # 创建连接(移除末尾的斜杠,设置连接超时)
@@ -155,15 +157,32 @@ class LDAPAuthService:
155
157
  )
156
158
 
157
159
  except LDAPException as e:
158
- last_error = e
160
+ errors.append((url, str(e)))
159
161
  SYLogger.warning(f"[LDAP] 连接 {url} 失败: {e}")
160
162
  continue
161
163
 
162
- SYLogger.error(f"[LDAP] 用户 {username} 认证失败: {last_error}")
163
- return LDAPAuthResult(
164
- success=False,
165
- error=f"认证失败: {last_error}" if last_error else "认证失败",
166
- )
164
+ # 优先返回认证类错误(密码错误等),而不是连接超时
165
+ # 按优先级排序:invalidCredentials / invalidAttribute / insufficientAccess 优先
166
+ auth_keywords = ["invalidcredentials", "invalidattribute", "insufficientaccess", "密码", "credential"]
167
+ for url, err in errors:
168
+ if any(kw in err.lower() for kw in auth_keywords):
169
+ SYLogger.error(f"[LDAP] 用户 {username} 认证失败: {err}")
170
+ return LDAPAuthResult(
171
+ success=False,
172
+ error=f"认证失败: {err}",
173
+ )
174
+
175
+ # 全是连接类错误,返回第一个(通常是主服务器)
176
+ if errors:
177
+ first_err = errors[0][1]
178
+ SYLogger.error(f"[LDAP] 用户 {username} 认证失败: {first_err}")
179
+ return LDAPAuthResult(
180
+ success=False,
181
+ error=f"认证失败: {first_err}",
182
+ )
183
+
184
+ SYLogger.error(f"[LDAP] 用户 {username} 认证失败: 未知错误")
185
+ return LDAPAuthResult(success=False, error="认证失败: 未知错误")
167
186
 
168
187
  def _build_user_dn(self, username: str) -> str:
169
188
  """构建用户 DN