sycommon-python-lib 0.2.10a8__tar.gz → 0.2.10a10__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 (373) hide show
  1. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/PKG-INFO +21 -21
  2. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/pyproject.toml +22 -22
  3. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/sandbox/file_ops.py +9 -3
  4. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/skills_retry_patch.py +10 -2
  5. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/summarization_utils.py +3 -2
  6. sycommon_python_lib-0.2.10a10/src/sycommon/health/readiness.py +394 -0
  7. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/logging/kafka_log.py +224 -23
  8. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/middleware.py +4 -0
  9. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/sandbox.py +17 -3
  10. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/traceid.py +55 -1
  11. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/sandbox.py +8 -2
  12. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/rabbitmq/rabbitmq_client.py +310 -20
  13. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/rabbitmq/rabbitmq_pool.py +76 -13
  14. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +1 -0
  15. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +57 -10
  16. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/rabbitmq/rabbitmq_service_core.py +68 -45
  17. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +32 -5
  18. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/services.py +4 -0
  19. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_consumer_recovery_fix.py +3 -0
  20. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_sandbox_glob_hardening.py +89 -0
  21. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_upgrade_aio_pika.py +2 -2
  22. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_upgrade_verification.py +7 -7
  23. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon_python_lib.egg-info/PKG-INFO +21 -21
  24. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
  25. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon_python_lib.egg-info/requires.txt +20 -20
  26. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/README.md +0 -0
  27. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/setup.cfg +0 -0
  28. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/__init__.py +0 -0
  29. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/cli.py +0 -0
  30. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/core/__init__.py +0 -0
  31. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/core/console.py +0 -0
  32. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/core/models.py +0 -0
  33. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/core/project.py +0 -0
  34. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/core/utils.py +0 -0
  35. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/__init__.py +0 -0
  36. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/README.md.tpl +0 -0
  37. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/__init__.py +0 -0
  38. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  43. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  44. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  45. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/api/query.py.tpl +0 -0
  46. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  47. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  48. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/app.py.tpl +0 -0
  49. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  53. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/db/service.py.tpl +0 -0
  54. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/model/parse.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  58. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/.env.tpl +0 -0
  59. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/.gitignore.tpl +0 -0
  60. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/Dockerfile.tpl +0 -0
  61. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/README.md.tpl +0 -0
  62. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/__init__.py +0 -0
  63. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/app.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/app.yaml.tpl +0 -0
  65. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/client/__init__.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/model/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/model/file_info.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/base/requirements.txt.tpl +0 -0
  70. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/cli/README.md.tpl +0 -0
  71. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/cli/__init__.py +0 -0
  72. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/cli/app.py.tpl +0 -0
  73. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  75. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  76. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  77. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/README.md.tpl +0 -0
  78. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/__init__.py +0 -0
  79. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/api/__init__.py.tpl +0 -0
  80. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/api/echo.py.tpl +0 -0
  81. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  82. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  83. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/app.py.tpl +0 -0
  84. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/client/__init__.py.tpl +0 -0
  85. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/model/__init__.py.tpl +0 -0
  86. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  87. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/command/templates/web/tools/mq.py.tpl +0 -0
  88. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/nexus/__init__.py +0 -0
  89. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/__init__.py +0 -0
  90. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/__main__.py +0 -0
  91. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/acp/__init__.py +0 -0
  92. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/acp/config.py +0 -0
  93. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/acp/executor.py +0 -0
  94. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/acp/registry.py +0 -0
  95. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/acp/server.py +0 -0
  96. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/agents/__init__.py +0 -0
  97. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/agents/factory.py +0 -0
  98. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/agents/prompts.py +0 -0
  99. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/__init__.py +0 -0
  100. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/browser.py +0 -0
  101. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/capabilities/__init__.py +0 -0
  102. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/capabilities/console.py +0 -0
  103. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/capabilities/dom.py +0 -0
  104. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/capabilities/network.py +0 -0
  105. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  106. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/capabilities/performance.py +0 -0
  107. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  108. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/client.py +0 -0
  109. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/protocol.py +0 -0
  110. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cdp/repl.py +0 -0
  111. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/cli.py +0 -0
  112. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/__init__.py +0 -0
  113. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/acp_cmd.py +0 -0
  114. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/acp_serve_cmd.py +0 -0
  115. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/cdp_cmd.py +0 -0
  116. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/chat_cmd.py +0 -0
  117. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/create_cmd.py +0 -0
  118. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/evaluate_cmd.py +0 -0
  119. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/init_cmd.py +0 -0
  120. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/memory_cmd.py +0 -0
  121. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/resume_cmd.py +0 -0
  122. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/rollback_cmd.py +0 -0
  123. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/commands/run_cmd.py +0 -0
  124. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/core/__init__.py +0 -0
  125. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/core/backend.py +0 -0
  126. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/core/config.py +0 -0
  127. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/core/display.py +0 -0
  128. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/core/git_integration.py +0 -0
  129. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/core/llm.py +0 -0
  130. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/core/state.py +0 -0
  131. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/evaluate/__init__.py +0 -0
  132. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/evaluate/api_evaluator.py +0 -0
  133. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/memory/__init__.py +0 -0
  134. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/memory/compressor.py +0 -0
  135. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/memory/full.py +0 -0
  136. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/memory/hot.py +0 -0
  137. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/memory/manager.py +0 -0
  138. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/memory/warm.py +0 -0
  139. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/mode/__init__.py +0 -0
  140. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/mode/create.py +0 -0
  141. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/mode/optimize.py +0 -0
  142. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/models/__init__.py +0 -0
  143. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/models/config_models.py +0 -0
  144. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/__init__.py +0 -0
  145. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/baseline_tests.py +0 -0
  146. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/checkpoint.py +0 -0
  147. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/convergence.py +0 -0
  148. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/diagnosis.py +0 -0
  149. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/engine.py +0 -0
  150. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/environment.py +0 -0
  151. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/experience.py +0 -0
  152. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/harness_prompts.py +0 -0
  153. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/history.py +0 -0
  154. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/optimization_logger.py +0 -0
  155. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/pre_validation.py +0 -0
  156. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/reward.py +0 -0
  157. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/strategy_bandit.py +0 -0
  158. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/strategy_generator.py +0 -0
  159. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/rl/strategy_prompts.py +0 -0
  160. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/simple_chat_agent.py +0 -0
  161. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycli/skills/__init__.py +0 -0
  162. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/__init__.py +0 -0
  163. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/__init__.py +0 -0
  164. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/acp/__init__.py +0 -0
  165. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/acp/client.py +0 -0
  166. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/acp/fetch.py +0 -0
  167. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/acp/server_adapter.py +0 -0
  168. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/acp/ssh_init.py +0 -0
  169. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/acp/tool.py +0 -0
  170. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/agent_manager.py +0 -0
  171. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/chat_events.py +0 -0
  172. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/deep_agent.py +0 -0
  173. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/mcp/__init__.py +0 -0
  174. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/mcp/models.py +0 -0
  175. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  176. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/middleware/model_request_prep.py +0 -0
  177. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
  178. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  179. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  180. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/multi_agent_team.py +0 -0
  181. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/reasoning_content_patch.py +0 -0
  182. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/resume_compactor.py +0 -0
  183. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/sandbox/__init__.py +0 -0
  184. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  185. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  186. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  187. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  188. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  189. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/agent/sandbox/session.py +0 -0
  190. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/auth/__init__.py +0 -0
  191. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/auth/ldap_service.py +0 -0
  192. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/auth/oa_cache.py +0 -0
  193. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/auth/oa_crypto.py +0 -0
  194. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/auth/oa_service.py +0 -0
  195. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  196. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/ACPAgentConfig.py +0 -0
  197. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/Config.py +0 -0
  198. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/DatabaseConfig.py +0 -0
  199. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/EgressPolicyConfig.py +0 -0
  200. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  201. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/EmbeddingConfig.py +0 -0
  202. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/LLMConfig.py +0 -0
  203. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/LangfuseConfig.py +0 -0
  204. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/MQConfig.py +0 -0
  205. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/PgConfig.py +0 -0
  206. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/RedisConfig.py +0 -0
  207. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/RerankerConfig.py +0 -0
  208. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/SentryConfig.py +0 -0
  209. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/XxlJobConfig.py +0 -0
  210. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/__init__.py +0 -0
  211. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/config/config_change_notifier.py +0 -0
  212. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/database/async_base_db_service.py +0 -0
  213. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/database/async_database_service.py +0 -0
  214. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/database/base_db_service.py +0 -0
  215. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/database/database_service.py +0 -0
  216. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/database/elasticsearch_service.py +0 -0
  217. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  218. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/database/redis_service.py +0 -0
  219. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/database/resilient_pg_saver.py +0 -0
  220. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/database/token_usage_db_service.py +0 -0
  221. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/health/__init__.py +0 -0
  222. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/health/health_check.py +0 -0
  223. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/health/metrics.py +0 -0
  224. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/health/ping.py +0 -0
  225. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/heartbeat_process/__init__.py +0 -0
  226. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  227. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  228. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  229. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/__init__.py +0 -0
  230. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/embedding.py +0 -0
  231. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/get_llm.py +0 -0
  232. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/llm_logger.py +0 -0
  233. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/llm_tokens.py +0 -0
  234. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  235. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  236. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  237. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/struct_token.py +0 -0
  238. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/sy_langfuse.py +0 -0
  239. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  240. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  241. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/token_usage_es_service.py +0 -0
  242. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  243. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/token_utils.py +0 -0
  244. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/llm/usage_token.py +0 -0
  245. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/logging/__init__.py +0 -0
  246. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/logging/async_sql_logger.py +0 -0
  247. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/logging/bounded_kafka_sink.py +0 -0
  248. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/logging/bounded_stdout_sink.py +0 -0
  249. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/logging/log_masker.py +0 -0
  250. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/logging/logger_levels.py +0 -0
  251. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/logging/logger_wrapper.py +0 -0
  252. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/logging/process_logger.py +0 -0
  253. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/logging/sql_logger.py +0 -0
  254. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/mcp_server/__init__.py +0 -0
  255. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/mcp_server/server.py +0 -0
  256. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/__init__.py +0 -0
  257. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/context.py +0 -0
  258. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/cors.py +0 -0
  259. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/docs.py +0 -0
  260. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/egress_wall.py +0 -0
  261. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/exception.py +0 -0
  262. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/monitor_memory.py +0 -0
  263. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/mq.py +0 -0
  264. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/sandbox_gateway.py +0 -0
  265. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/timeout.py +0 -0
  266. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/token_tracking.py +0 -0
  267. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  268. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/__init__.py +0 -0
  269. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/base_http.py +0 -0
  270. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/log.py +0 -0
  271. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/mcp_server_config.py +0 -0
  272. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/mqlistener_config.py +0 -0
  273. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/mqmsg_model.py +0 -0
  274. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/mqsend_config.py +0 -0
  275. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/sso_user.py +0 -0
  276. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/token_usage.py +0 -0
  277. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/token_usage_mysql.py +0 -0
  278. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/models/xxljob_handler_config.py +0 -0
  279. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/notice/__init__.py +0 -0
  280. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  281. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/notice/wecom_message.py +0 -0
  282. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  283. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/rabbitmq/rabbit_management_client.py +0 -0
  284. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  285. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  286. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/sentry/__init__.py +0 -0
  287. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/sentry/sy_sentry.py +0 -0
  288. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/sse/__init__.py +0 -0
  289. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/sse/event.py +0 -0
  290. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/sse/sse.py +0 -0
  291. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/__init__.py +0 -0
  292. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/example.py +0 -0
  293. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/example2.py +0 -0
  294. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/feign.py +0 -0
  295. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/feign_client.py +0 -0
  296. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/nacos_client_base.py +0 -0
  297. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  298. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  299. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/nacos_service.py +0 -0
  300. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  301. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  302. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/synacos/param.py +0 -0
  303. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/deep_agent_server.py +0 -0
  304. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_backend_factory_compat.py +0 -0
  305. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_consistent_hash.py +0 -0
  306. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_consume_dedup.py +0 -0
  307. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_consumer_broker_health.py +0 -0
  308. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  309. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  310. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_consumer_tags_sync.py +0 -0
  311. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_db_keepalive.py +0 -0
  312. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_deep_agent.py +0 -0
  313. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  314. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_email.py +0 -0
  315. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_encoding_cache.py +0 -0
  316. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_env_tenant_helper.py +0 -0
  317. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -0
  318. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -0
  319. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_fault_injection_real.py +0 -0
  320. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_fix_verification.py +0 -0
  321. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_heartbeat_timeout.py +0 -0
  322. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_integration_real_broker.py +0 -0
  323. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_mcp_server.py +0 -0
  324. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  325. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_mq.py +0 -0
  326. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_mq_config_driven.py +0 -0
  327. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_nacos_llm_real.py +0 -0
  328. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_oa_login.py +0 -0
  329. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  330. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -0
  331. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_real_summarization.py +0 -0
  332. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_reconnect_scenarios.py +0 -0
  333. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_services_plugin_defaults.py +0 -0
  334. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_summarization_config.py +0 -0
  335. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_summarization_real.py +0 -0
  336. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  337. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
  338. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tools/__init__.py +0 -0
  339. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tools/async_utils.py +0 -0
  340. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tools/docs.py +0 -0
  341. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tools/env.py +0 -0
  342. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tools/merge_headers.py +0 -0
  343. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tools/snowflake.py +0 -0
  344. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tools/syemail.py +0 -0
  345. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tools/time_utils.py +0 -0
  346. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tools/timing.py +0 -0
  347. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/tools/user_id.py +0 -0
  348. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/xxljob/__init__.py +0 -0
  349. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon/xxljob/xxljob_service.py +0 -0
  350. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  351. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  352. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  353. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_acp_tool.py +0 -0
  354. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_asyncio_logging.py +0 -0
  355. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_config_change_notifier.py +0 -0
  356. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_hotreload_snapshot.py +0 -0
  357. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_llm_apikey_contextvar.py +0 -0
  358. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_log_masker.py +0 -0
  359. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_resilient_pg_saver.py +0 -0
  360. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_sandbox_path_guard.py +0 -0
  361. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_sensitive_guard.py +0 -0
  362. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_simple_chat_agent.py +0 -0
  363. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_skill_regex_upgrade.py +0 -0
  364. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_skill_write_guard.py +0 -0
  365. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_streaming_e2e.py +0 -0
  366. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_summary_echo_break_loop.py +0 -0
  367. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_sycli.py +0 -0
  368. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_sylogger_fixes.py +0 -0
  369. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_sync_skills_to_sandbox.py +0 -0
  370. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_time_utils.py +0 -0
  371. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_traceid_omit_base64.py +0 -0
  372. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_upload_concurrency.py +0 -0
  373. {sycommon_python_lib-0.2.10a8 → sycommon_python_lib-0.2.10a10}/tests/test_upload_e2e_http.py +0 -0
@@ -1,24 +1,24 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.10a8
3
+ Version: 0.2.10a10
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
7
- Requires-Dist: aio-pika==10.0.1
8
- Requires-Dist: aiohttp==3.14.3
7
+ Requires-Dist: aio-pika==10.1.0
8
+ Requires-Dist: aiohttp==3.14.4
9
9
  Requires-Dist: aiomysql==0.3.2
10
- Requires-Dist: anyio==4.14.2
10
+ Requires-Dist: anyio==4.15.1
11
11
  Requires-Dist: decorator==5.3.1
12
- Requires-Dist: deepagents==0.7.6
13
- Requires-Dist: elasticsearch==9.5.0
14
- Requires-Dist: fastapi==0.141.1
12
+ Requires-Dist: deepagents==0.7.23
13
+ Requires-Dist: elasticsearch==9.5.1
14
+ Requires-Dist: fastapi==0.143.0
15
15
  Requires-Dist: jinja2==3.1.6
16
16
  Requires-Dist: kafka-python==3.0.11
17
- Requires-Dist: langchain==1.3.18
18
- Requires-Dist: langchain-core==1.6.1
19
- Requires-Dist: langchain-openai==1.6.0
20
- Requires-Dist: langfuse==4.15.1
21
- Requires-Dist: langgraph==1.2.11
17
+ Requires-Dist: langchain==1.4.4
18
+ Requires-Dist: langchain-core==1.6.9
19
+ Requires-Dist: langchain-openai==1.7.0
20
+ Requires-Dist: langfuse==4.17.0
21
+ Requires-Dist: langgraph==1.2.14
22
22
  Requires-Dist: langgraph-checkpoint-postgres==3.1.2
23
23
  Requires-Dist: langgraph-checkpoint-redis==0.5.2
24
24
  Requires-Dist: ldap3==2.9.1
@@ -27,24 +27,24 @@ Requires-Dist: mysql-connector-python==26.7.0
27
27
  Requires-Dist: nacos-sdk-python<3.0,==2.0.11
28
28
  Requires-Dist: psutil==7.2.2
29
29
  Requires-Dist: pyxxl==0.4.8
30
- Requires-Dist: pydantic==2.13.5
31
- Requires-Dist: python-dotenv==1.2.3
30
+ Requires-Dist: pydantic==2.14.0
31
+ Requires-Dist: python-dotenv==1.2.4
32
32
  Requires-Dist: python-multipart==0.0.32
33
33
  Requires-Dist: pyyaml==6.0.3
34
34
  Requires-Dist: redis==7.4.0
35
- Requires-Dist: sentry-sdk[fastapi]==2.68.1
36
- Requires-Dist: sqlalchemy[asyncio]==2.0.52
37
- Requires-Dist: starlette[full]==1.6.0
35
+ Requires-Dist: sentry-sdk[fastapi]==2.71.0
36
+ Requires-Dist: sqlalchemy[asyncio]==2.1.4
37
+ Requires-Dist: starlette[full]==1.7.0
38
38
  Requires-Dist: tiktoken==0.14.0
39
- Requires-Dist: uvicorn==0.52.4
39
+ Requires-Dist: uvicorn==0.54.0
40
40
  Requires-Dist: wecom-aibot-python-sdk==1.0.2
41
41
  Requires-Dist: twine==7.0.0
42
42
  Requires-Dist: minio==7.2.20
43
43
  Requires-Dist: langchain-mcp-adapters==0.3.2
44
44
  Requires-Dist: fastapi-mcp==0.4.0
45
- Requires-Dist: psycopg[binary,pool]==3.3.5
46
- Requires-Dist: agent-client-protocol==0.11.0
47
- Requires-Dist: langchain-acp==1.7.0
45
+ Requires-Dist: psycopg[binary,pool]==3.3.6
46
+ Requires-Dist: agent-client-protocol==0.12.1
47
+ Requires-Dist: langchain-acp==1.10.0
48
48
  Requires-Dist: pypinyin==0.55.0
49
49
 
50
50
  # sycommon-python-lib
@@ -1,25 +1,25 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.10a8"
3
+ version = "0.2.10a10"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
7
7
  dependencies = [
8
- "aio-pika==10.0.1",
9
- "aiohttp==3.14.3",
8
+ "aio-pika==10.1.0",
9
+ "aiohttp==3.14.4",
10
10
  "aiomysql==0.3.2",
11
- "anyio==4.14.2",
11
+ "anyio==4.15.1",
12
12
  "decorator==5.3.1",
13
- "deepagents==0.7.6",
14
- "elasticsearch==9.5.0",
15
- "fastapi==0.141.1",
13
+ "deepagents==0.7.23",
14
+ "elasticsearch==9.5.1",
15
+ "fastapi==0.143.0",
16
16
  "jinja2==3.1.6",
17
17
  "kafka-python==3.0.11",
18
- "langchain==1.3.18",
19
- "langchain-core==1.6.1",
20
- "langchain-openai==1.6.0",
21
- "langfuse==4.15.1",
22
- "langgraph==1.2.11",
18
+ "langchain==1.4.4",
19
+ "langchain-core==1.6.9",
20
+ "langchain-openai==1.7.0",
21
+ "langfuse==4.17.0",
22
+ "langgraph==1.2.14",
23
23
  "langgraph-checkpoint-postgres==3.1.2",
24
24
  "langgraph-checkpoint-redis==0.5.2",
25
25
  "ldap3==2.9.1",
@@ -28,29 +28,29 @@ dependencies = [
28
28
  "nacos-sdk-python==2.0.11,<3.0",
29
29
  "psutil==7.2.2",
30
30
  "pyxxl==0.4.8",
31
- "pydantic==2.13.5",
32
- "python-dotenv==1.2.3",
31
+ "pydantic==2.14.0",
32
+ "python-dotenv==1.2.4",
33
33
  "python-multipart==0.0.32",
34
34
  "pyyaml==6.0.3",
35
35
  "redis==7.4.0",
36
- "sentry-sdk[fastapi]==2.68.1",
37
- "sqlalchemy[asyncio]==2.0.52",
38
- "starlette[full]==1.6.0",
36
+ "sentry-sdk[fastapi]==2.71.0",
37
+ "sqlalchemy[asyncio]==2.1.4",
38
+ "starlette[full]==1.7.0",
39
39
  "tiktoken==0.14.0",
40
- "uvicorn==0.52.4",
40
+ "uvicorn==0.54.0",
41
41
  "wecom-aibot-python-sdk==1.0.2",
42
42
  "twine==7.0.0",
43
43
  "minio==7.2.20",
44
44
  "langchain-mcp-adapters==0.3.2",
45
45
  "fastapi-mcp==0.4.0",
46
- "psycopg[binary,pool]==3.3.5",
47
- "agent-client-protocol==0.11.0",
48
- "langchain-acp==1.7.0",
46
+ "psycopg[binary,pool]==3.3.6",
47
+ "agent-client-protocol==0.12.1",
48
+ "langchain-acp==1.10.0",
49
49
  "pypinyin==0.55.0",
50
50
  ]
51
51
 
52
52
  [tool.setuptools]
53
- packages = {find = {where = ["src"], exclude = ["*.__pycache__", "*.__pycache__.*"]}}
53
+ packages = {find = {where = ["src"], exclude = ["*.__pycache__", "*.__pycache__.*", "*.tests", "*.tests.*"]}}
54
54
  package-data = {command = ["templates/**/*", "templates/**/.*"], sycommon = ["llm/tiktoken_cache/*"]}
55
55
 
56
56
  [build-system]
@@ -682,18 +682,24 @@ class FileOperationsMixin:
682
682
 
683
683
  @staticmethod
684
684
  def _parse_glob_response(result: dict, path: str) -> GlobResult:
685
- """解析服务端 glob 响应 GlobResponse{matches, error, truncated}。
685
+ """解析服务端 glob 响应 GlobResponse{matches, error, truncated, truncation_reason}。
686
686
 
687
- 对齐 0.7.7 _parse_glob_output 的硬错误原则:error 非空即硬失败
687
+ 对齐 0.7.23 _parse_glob_output 的硬错误原则:error 非空即硬失败
688
688
  (matches=None),绝不把失败静默成空结果——模型会把空列表当成
689
689
  「文件不存在」的证据。truncated 只标记部分结果,matches 仍有效。
690
+ truncation_reason 透传(budget/unreadable):下游 FilesystemMiddleware
691
+ 按 reason 选提示词,unreadable 不区分会被当 budget → 模型无效重试。
690
692
  """
691
693
  error = result.get("error")
692
694
  if error:
693
695
  return GlobResult(matches=None, error=f"Path '{path}': {error}")
694
696
  matches = [FileInfo(**item) for item in result.get("matches", [])]
697
+ reason = result.get("truncation_reason")
698
+ if reason not in ("budget", "unreadable"):
699
+ reason = None
695
700
  return GlobResult(
696
- matches=matches, truncated=bool(result.get("truncated", False)))
701
+ matches=matches, truncated=bool(result.get("truncated", False)),
702
+ truncation_reason=reason)
697
703
 
698
704
  # ============== 树形目录 ==============
699
705
 
@@ -40,6 +40,12 @@ class RetrySkillsMiddleware(_ORIG_MIDDLEWARE):
40
40
  """
41
41
 
42
42
  async def abefore_agent(self, state, runtime, config):
43
+ # deepagents 0.7.23 语义:state 里 skills_metadata=None 是显式重载请求
44
+ # (上游判断从 "in state" 改为 "is not None")。必须透传给 super(),
45
+ # 否则下方 `or []` 会把 None 吞成空列表、误判为"真零技能"而吃掉重载。
46
+ if state.get("skills_metadata", "__missing__") is None:
47
+ return await super().abefore_agent(state, runtime, config)
48
+
43
49
  # 未加载过 → 走上游逻辑(会 fall through 到正常加载)
44
50
  if "skills_metadata" not in state:
45
51
  return await super().abefore_agent(state, runtime, config)
@@ -60,8 +66,10 @@ class RetrySkillsMiddleware(_ORIG_MIDDLEWARE):
60
66
  logger.warning(
61
67
  "[SkillsRetry] 检测到缓存为空的技能列表(加载曾失败),"
62
68
  "本会话轮次重新加载 skills: %s", self.sources)
63
- # 清掉旧值让上游 super() 不再命中 "skills_metadata" in state
64
- # (dict 可变,删 key 即可;state 是 langgraph 传入的 dict 视图)
69
+ # 清掉旧值让上游不再命中缓存判断
70
+ # (dict 可变,删 key 即可;state 是 langgraph 传入的 dict 视图。
71
+ # 0.7.6 判断 "skills_metadata" in state / 0.7.23 判断 is not None,
72
+ # 删 key 两种版本都能穿过)
65
73
  try:
66
74
  state.pop("skills_metadata", None)
67
75
  state.pop("skills_load_errors", None)
@@ -21,7 +21,8 @@ from langchain_core.messages.utils import count_tokens_approximately
21
21
 
22
22
  if TYPE_CHECKING:
23
23
  from langchain_core.language_models import BaseChatModel
24
- from deepagents.backends.protocol import BACKEND_TYPES
24
+ # deepagents 0.7.6 用 BACKEND_TYPES,0.7.23 起移除,统一为 BackendProtocol
25
+ from deepagents.backends.protocol import BackendProtocol
25
26
 
26
27
  logger = logging.getLogger(__name__)
27
28
 
@@ -376,7 +377,7 @@ logger.info("[SummarizationUtils] 防御性补丁已应用: DEFAULT_SUMMARY_PROM
376
377
  def build_summarization_middleware(
377
378
  model: BaseChatModel,
378
379
  model_name: str,
379
- backend: "BACKEND_TYPES",
380
+ backend: "BackendProtocol",
380
381
  *,
381
382
  trigger_fraction: float = 0.60,
382
383
  keep_fraction: float = 0.10,
@@ -0,0 +1,394 @@
1
+ import asyncio
2
+ import time
3
+
4
+ from fastapi import FastAPI, APIRouter
5
+ from fastapi.responses import JSONResponse
6
+ from starlette.concurrency import run_in_threadpool
7
+
8
+ from sycommon.logging.kafka_log import SYLogger
9
+
10
+ # DB/Redis 拨测超时(秒);MQ 通道往返探活略宽
11
+ PROBE_TIMEOUT_SECONDS = 3.0
12
+ MQ_PROBE_TIMEOUT_SECONDS = 5.0
13
+
14
+ # 拨测结果 TTL 缓存(秒):K8s/Nacos/LB 多源轮询直接命中缓存,
15
+ # 避免故障期间探针流量放大成对依赖的额外负载
16
+ PROBE_CACHE_TTL_SECONDS = 2.0
17
+
18
+ # 等拨测锁超时(秒):底层库吞取消语义的兜底,防端点整体 wedged。
19
+ # 预算必须覆盖最慢合法路径再加余量:MQ 撞换池窗口的兜底重探最坏
20
+ # 2×MQ_PROBE_TIMEOUT —— 写小了会把正常慢探测误判成 wedged 答 stale
21
+ # (对齐 Go lib fca8ee1 锁预算修复:TTL + 2×MQ + 余量)。
22
+ LOCK_WAIT_TIMEOUT_SECONDS = (
23
+ PROBE_CACHE_TTL_SECONDS + 2 * MQ_PROBE_TIMEOUT_SECONDS + 5.0)
24
+
25
+
26
+ def _skipped(reason: str) -> dict:
27
+ return {"status": "SKIPPED", "details": {"reason": reason}}
28
+
29
+
30
+ def _err_type_only(exc: BaseException) -> str:
31
+ """error 字段只回显异常类型名,不回显消息。
32
+
33
+ mysql/redis/amqp 的异常消息普遍内嵌 host、username 甚至密码片段
34
+ (如 "Access denied for user 'svc'@'10.1.2.3' (using password: YES)"),
35
+ 拨测端点无鉴权可被任意网络可达方访问,详情只进日志不进响应。
36
+ """
37
+ return type(exc).__name__
38
+
39
+
40
+ async def _probe_sync_engine(engine) -> None:
41
+ """同步 engine 的 SELECT 1(丢线程池,避免阻塞事件循环)。
42
+
43
+ 与 DatabaseConnector.test_connection 同款(database_service.py:183),
44
+ 只读不写。text 在函数内导入:middleware 链不应硬依赖 sqlalchemy
45
+ (纯 MQ/web 项目可能未装 DB 依赖栈)。
46
+ """
47
+ from sqlalchemy import text
48
+
49
+ def _do_probe() -> None:
50
+ with engine.connect() as connection:
51
+ connection.scalar(text("SELECT 1"))
52
+
53
+ await run_in_threadpool(_do_probe)
54
+
55
+
56
+ async def _probe_async_engine(engine) -> None:
57
+ """异步 engine 的 SELECT 1(只读不写)。"""
58
+ from sqlalchemy import text
59
+
60
+ async with engine.connect() as connection:
61
+ await connection.execute(text("SELECT 1"))
62
+
63
+
64
+ async def _timed_probe(coro, timeout: float, probe_name: str) -> dict:
65
+ """单组件拨测统一包裹:计时 + 超时 + 异常→DOWN,互不影响其他组件。
66
+
67
+ error 只含异常类型名(详见 _err_type_only);完整异常进 WARNING 日志。
68
+ """
69
+ start = time.monotonic()
70
+ try:
71
+ await asyncio.wait_for(coro, timeout=timeout)
72
+ except asyncio.TimeoutError:
73
+ return {
74
+ "status": "DOWN",
75
+ "details": {
76
+ "probe": probe_name,
77
+ "error": "probe timeout",
78
+ "latency_ms": round((time.monotonic() - start) * 1000, 1),
79
+ },
80
+ }
81
+ except Exception as e:
82
+ # 日志侧同样只留异常类型名:消息内嵌 host/user/密码片段
83
+ # (credential-log-defense 姿态),集中式 Kafka 日志可被
84
+ # 有 topic 权限者读取,与响应侧同标准
85
+ SYLogger.warning(
86
+ f"[READINESS] probe={probe_name} failed: {type(e).__name__}")
87
+ return {
88
+ "status": "DOWN",
89
+ "details": {
90
+ "probe": probe_name,
91
+ "error": _err_type_only(e),
92
+ "latency_ms": round((time.monotonic() - start) * 1000, 1),
93
+ },
94
+ }
95
+ return {
96
+ "status": "UP",
97
+ "details": {
98
+ "probe": probe_name,
99
+ "latency_ms": round((time.monotonic() - start) * 1000, 1),
100
+ },
101
+ }
102
+
103
+
104
+ def _declared(component: str) -> bool:
105
+ """项目是否「声明」使用了某组件(Services.plugins 入参)。
106
+
107
+ 区分「没用」与「声明了但初始化静默失败」:setup_database 在 Nacos
108
+ 共享配置缺 datasource 段时不报错留 engine=None,RedisService.init
109
+ 缺 redis.yml 时记日志禁用——声明了却没起来不该报 SKIPPED 放行流量
110
+ (对齐 Go lib readiness: errDBNotInitialised → DOWN)。
111
+ """
112
+ try:
113
+ from sycommon.services import Services
114
+ return bool(Services.__dict__.get(f"_enable_{component}", False))
115
+ except Exception:
116
+ return False
117
+
118
+
119
+ async def _check_database() -> dict:
120
+ """数据库拨测:sync/async engine 任一存在即探测(SELECT 1,只读)。
121
+
122
+ 引擎在启动时由 setup_database 按 app.yaml Name → Nacos 共享配置建立。
123
+ 未声明使用数据库 → SKIPPED;声明了但 engine 为 None(配置缺失/
124
+ 初始化静默失败)→ DOWN,不放行流量。两类 engine 并存时都探,
125
+ 任一 DOWN 即 DOWN,响应里各带 type 标注。
126
+ """
127
+ from sycommon.database.async_database_service import AsyncDatabaseService
128
+ from sycommon.database.database_service import DatabaseService
129
+
130
+ sync_engine = None
131
+ async_engine = None
132
+ try:
133
+ sync_engine = DatabaseService.engine()
134
+ except Exception:
135
+ sync_engine = None
136
+ try:
137
+ async_engine = AsyncDatabaseService.engine()
138
+ except Exception:
139
+ async_engine = None
140
+
141
+ if sync_engine is None and async_engine is None:
142
+ if _declared("database"):
143
+ return {
144
+ "status": "DOWN",
145
+ "details": {
146
+ "reason": "database declared but engine not initialized"},
147
+ }
148
+ return _skipped("database engine not initialized")
149
+
150
+ labels = []
151
+ probe_coros = []
152
+ if sync_engine is not None:
153
+ labels.append("sync")
154
+ probe_coros.append(_probe_sync_engine(sync_engine))
155
+ if async_engine is not None:
156
+ labels.append("async")
157
+ probe_coros.append(_probe_async_engine(async_engine))
158
+
159
+ results = await asyncio.gather(*(
160
+ _timed_probe(coro, PROBE_TIMEOUT_SECONDS, "SELECT 1")
161
+ for coro in probe_coros))
162
+ for label, result in zip(labels, results):
163
+ result["details"]["type"] = label
164
+
165
+ # 双 engine 并存:任意 DOWN 都保留另一路结果供排查(半瘫时
166
+ # 运维能看到哪半是好的)。engines 详情写入「返回的那个」结果:
167
+ # DOWN 时返回第一个 DOWN 项,UP 时返回 results[0]
168
+ down_result = next(
169
+ (r for r in results if r["status"] == "DOWN"), None)
170
+ returned = down_result if down_result is not None else results[0]
171
+ if len(results) == 2:
172
+ engines = {}
173
+ for label, r in zip(labels, results):
174
+ entry = {"status": r["status"],
175
+ "latency_ms": r["details"].get("latency_ms")}
176
+ if r["status"] == "DOWN":
177
+ entry["error"] = r["details"].get(
178
+ "error", r["details"].get("reason"))
179
+ engines[label] = entry
180
+ returned["details"]["engines"] = engines
181
+ return returned
182
+
183
+
184
+ async def _check_redis() -> dict:
185
+ """Redis 拨测:已初始化才 PING(未初始化时不得触发懒初始化)。
186
+
187
+ 声明了 redis 但未初始化(redis.yml 缺失被静默禁用)→ DOWN。
188
+ """
189
+ from sycommon.database.redis_service import RedisService
190
+
191
+ try:
192
+ initialized = RedisService.is_initialized()
193
+ except Exception:
194
+ initialized = False
195
+
196
+ if not initialized:
197
+ if _declared("redis"):
198
+ return {
199
+ "status": "DOWN",
200
+ "details": {
201
+ "reason": "redis declared but not initialized"},
202
+ }
203
+ return _skipped("redis not initialized")
204
+
205
+ async def _probe_redis_ping() -> None:
206
+ # RedisService.ping 内部异常时返回 False(不抛出),
207
+ # 显式转 DOWN;_ensure_initialized 的异常由 _timed_probe 兜底
208
+ if not await RedisService.ping():
209
+ raise RuntimeError("redis ping failed")
210
+
211
+ return await _timed_probe(
212
+ _probe_redis_ping(), PROBE_TIMEOUT_SECONDS, "PING")
213
+
214
+
215
+ async def _check_mq() -> dict:
216
+ """MQ 拨测:mq.yml 已加载才探测;连接池未就绪 → DOWN(readiness 语义)。
217
+
218
+ 探测用 pool.probe_connectivity()(真实通道往返、无状态机副作用),
219
+ 不用 is_alive()(与 15s 监控共享心跳计数/告警,且 3-strike 期间
220
+ 返回 True 对 readiness 是假阳)。
221
+
222
+ pool 引用经基类读取:init 写子类遮蔽、_rebuild_dead_pool 只写基类
223
+ (防状态分叉),两条链路并存时子类遮蔽可能是已关闭的旧池——统一
224
+ 从 RabbitMQCoreService 读拿「当前真实池」,杜绝重建后永久误 DOWN。
225
+ 探测失败时若怀疑撞上 reload/rebuild 换池窗口,重读一次再验:
226
+ 旧池已关闭且新池就绪说明是换池瞬间的假阴性。
227
+ """
228
+ from sycommon.rabbitmq.rabbitmq_service import RabbitMQService
229
+ from sycommon.rabbitmq.rabbitmq_service_core import RabbitMQCoreService
230
+
231
+ try:
232
+ configured = RabbitMQService.is_configured()
233
+ except Exception:
234
+ configured = False
235
+ if not configured:
236
+ if _declared("mq"):
237
+ return {
238
+ "status": "DOWN",
239
+ "details": {
240
+ "reason": "mq declared but not configured "
241
+ "(mq.yml missing or host empty)"},
242
+ }
243
+ return _skipped("mq not configured")
244
+
245
+ try:
246
+ def _current_pool():
247
+ # 经基类取当前真实池(绕开子类遮蔽的分叉)
248
+ return RabbitMQCoreService.__dict__.get(
249
+ "_connection_pool", None)
250
+
251
+ pool = _current_pool()
252
+ if pool is None or not getattr(pool, "_initialized", False):
253
+ return {
254
+ "status": "DOWN",
255
+ "details": {"reason": "connection pool not initialized"},
256
+ }
257
+ result = await _timed_probe(
258
+ _probe_mq_pool_alive(pool), MQ_PROBE_TIMEOUT_SECONDS,
259
+ "channel probe")
260
+ if result["status"] == "DOWN":
261
+ # 撞上 reload/rebuild 换池窗口的兜底:重读当前池,
262
+ # 新池已就绪则视为换池瞬间假阴性,重探一次
263
+ pool2 = _current_pool()
264
+ if pool2 is not None and pool2 is not pool \
265
+ and getattr(pool2, "_initialized", False):
266
+ result = await _timed_probe(
267
+ _probe_mq_pool_alive(pool2), MQ_PROBE_TIMEOUT_SECONDS,
268
+ "channel probe")
269
+ return result
270
+ except Exception as e:
271
+ # 同 _timed_probe:异常消息可能内嵌基础设施信息,只留类型名
272
+ SYLogger.warning(
273
+ f"[READINESS] mq check failed: {type(e).__name__}")
274
+ return {
275
+ "status": "DOWN",
276
+ "details": {"error": _err_type_only(e)},
277
+ }
278
+
279
+
280
+ async def _probe_mq_pool_alive(pool) -> None:
281
+ """MQ 池真实连通性:临时通道往返(不触碰心跳/告警状态机)。"""
282
+ if not await pool.probe_connectivity(timeout=MQ_PROBE_TIMEOUT_SECONDS):
283
+ raise RuntimeError("mq connection not alive")
284
+
285
+
286
+ def setup_readiness_handler(app: FastAPI):
287
+ """挂载 GET /actuator/health/readiness:按需拨测 DB/Redis/MQ。
288
+
289
+ 组件是否「在用」由各服务单例运行时状态判定(零配置):
290
+ - database: DatabaseService/AsyncDatabaseService engine 存在
291
+ - redis: RedisService.is_initialized()
292
+ - mq: RabbitMQService.is_configured()(mq.yml 已加载)
293
+
294
+ 在用组件任一 DOWN → HTTP 503;SKIPPED 不影响。
295
+ 结果带 PROBE_CACHE_TTL_SECONDS 缓存:多探针源(K8s/Nacos/LB)轮询
296
+ 时直接命中,避免故障期间探针流量放大成对依赖的额外负载。
297
+ 缓存命中并发去重:同窗口内并发请求共享同一轮拨测(_cache_lock)。
298
+ """
299
+ readiness_router = APIRouter()
300
+ # 模块级缓存(同类 app 多实例共享单例状态,缓存同域)
301
+ cached: dict = {"at": 0.0, "body": None, "status_code": 200}
302
+ cache_lock = asyncio.Lock()
303
+
304
+ def _cache_valid() -> bool:
305
+ return cached["body"] is not None \
306
+ and time.monotonic() - cached["at"] < PROBE_CACHE_TTL_SECONDS
307
+
308
+ async def _acquire_probe_turn() -> bool:
309
+ """获取本轮拨测权。锁带超时:底层库吞取消语义(aiormq 有界写
310
+ 队列满时 CancelledError 可被吞)会让在飞拨测永不返回,锁超时
311
+ 兜底防后续请求全体卡死,端点 wedged 直到重启。"""
312
+ try:
313
+ await asyncio.wait_for(
314
+ cache_lock.acquire(), timeout=LOCK_WAIT_TIMEOUT_SECONDS)
315
+ return True
316
+ except TimeoutError:
317
+ return False
318
+
319
+ def _release_probe_turn() -> None:
320
+ if cache_lock.locked():
321
+ cache_lock.release()
322
+
323
+ def _serve_cache() -> "JSONResponse":
324
+ return JSONResponse(
325
+ status_code=cached["status_code"], content=cached["body"])
326
+
327
+ async def _run_probes() -> tuple:
328
+ # 单组件异常/导入失败不得炸掉整个 gather(否则取消兄弟任务);
329
+ # gather return_exceptions + 逐个兜底
330
+ results = await asyncio.gather(
331
+ _check_database(), _check_redis(), _check_mq(),
332
+ return_exceptions=True)
333
+ names = ("database", "redis", "mq")
334
+ components = {}
335
+ for name, res in zip(names, results):
336
+ if isinstance(res, BaseException):
337
+ # 未预期的异常(含懒导入失败):该组件 DOWN,其余照常;
338
+ # 日志只留类型名(消息可能内嵌基础设施信息)
339
+ SYLogger.warning(
340
+ f"[READINESS] {name} check crashed: "
341
+ f"{type(res).__name__}")
342
+ components[name] = {
343
+ "status": "DOWN",
344
+ "details": {"error": type(res).__name__},
345
+ }
346
+ else:
347
+ components[name] = res
348
+ status = "DOWN" if any(
349
+ c["status"] == "DOWN" for c in components.values()) else "UP"
350
+ if status == "DOWN":
351
+ down = {k: v for k, v in components.items()
352
+ if v["status"] == "DOWN"}
353
+ SYLogger.warning(f"[READINESS] 依赖拨测 DOWN: {down}")
354
+ return status, {
355
+ "status": status, "components": components}
356
+
357
+ @readiness_router.get("/actuator/health/readiness")
358
+ async def readiness():
359
+ # 快路径:TTL 窗口内直接答缓存
360
+ if _cache_valid():
361
+ return _serve_cache()
362
+
363
+ # 并发去重:同窗口内并发请求共享同一轮拨测,避免惊群。
364
+ # 锁带超时(_acquire_probe_turn):极端场景下底层 close 路径
365
+ # 吞掉取消会让在飞拨测永不返回,超时兜底防端点整体 wedged。
366
+ if not await _acquire_probe_turn():
367
+ # 等锁超时:上一轮拨测卡死。有 stale 缓存就答 stale,
368
+ # 没有就只能 DOWN(总比无限挂起好)
369
+ if cached["body"] is not None:
370
+ return _serve_cache()
371
+ return JSONResponse(
372
+ status_code=503,
373
+ content={"status": "DOWN", "components": {
374
+ "readiness": {"status": "DOWN",
375
+ "details": {"error": "probe wedged"}}}})
376
+ try:
377
+ # 双检:等锁期间别的请求可能已刷新缓存
378
+ if _cache_valid():
379
+ return _serve_cache()
380
+ status, body = await _run_probes()
381
+ # 缓存时间戳记「探测完成时刻」,配 _cache_valid 的 < TTL 判定,
382
+ # 生效窗口恰为 TTL。此前写 at = now + TTL 再配 < TTL 判定,
383
+ # 实际窗口是 2×TTL(写读双方各加一次),且锁等待期的并发请求
384
+ # 更容易拿到过新鲜化窗口的旧结论(对齐 Go lib 精确 TTL 语义)。
385
+ cached["body"] = body
386
+ cached["status_code"] = 503 if status == "DOWN" else 200
387
+ cached["at"] = time.monotonic()
388
+ return JSONResponse(
389
+ status_code=cached["status_code"], content=body)
390
+ finally:
391
+ _release_probe_turn()
392
+
393
+ app.include_router(readiness_router)
394
+ return app