coding-proxy 0.5.1a3__tar.gz → 0.5.1a4__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 (196) hide show
  1. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/PKG-INFO +1 -1
  2. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/pyproject.toml +1 -1
  3. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/executor.py +2 -2
  4. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/server/dashboard.py +18 -1
  5. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_router_executor.py +10 -1
  6. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/uv.lock +1 -1
  7. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/.github/workflows/ci.yml +0 -0
  8. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/.github/workflows/coverage.yml +0 -0
  9. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/.github/workflows/release.yml +0 -0
  10. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/.gitignore +0 -0
  11. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/.pre-commit-config.yaml +0 -0
  12. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/AGENTS.md +0 -0
  13. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/CHANGELOG.md +0 -0
  14. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/CLAUDE.md +0 -0
  15. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/LICENSE +0 -0
  16. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/README.md +0 -0
  17. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/assets/dashboard-v0.4.0.png +0 -0
  18. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/assets/model-calling-v0.5.0.png +0 -0
  19. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/assets/session-v0.4.0.png +0 -0
  20. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/.agents/browser-validation.md +0 -0
  21. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/.agents/issue.md +0 -0
  22. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/.agents/knowledge-map.md +0 -0
  23. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/.agents/reference-specifications.md +0 -0
  24. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/arch/config-reference.md +0 -0
  25. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/arch/convert.md +0 -0
  26. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/arch/design-patterns.md +0 -0
  27. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/arch/routing.md +0 -0
  28. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/arch/testing.md +0 -0
  29. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/arch/vendors.md +0 -0
  30. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/framework.md +0 -0
  31. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/guide/api-reference.md +0 -0
  32. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/guide/cli-reference.md +0 -0
  33. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/guide/dashboard.md +0 -0
  34. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/guide/monitoring.md +0 -0
  35. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/guide/quickstart.md +0 -0
  36. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/guide/vendors.md +0 -0
  37. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/ops/ci-cd.md +0 -0
  38. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/user-guide.md +0 -0
  39. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/docs/zh-CN/README.md +0 -0
  40. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/__init__.py +0 -0
  41. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/__init__.py +0 -0
  42. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/__main__.py +0 -0
  43. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/auth/__init__.py +0 -0
  44. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/auth/providers/__init__.py +0 -0
  45. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/auth/providers/base.py +0 -0
  46. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/auth/providers/github.py +0 -0
  47. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/auth/providers/google.py +0 -0
  48. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/auth/runtime.py +0 -0
  49. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/auth/store.py +0 -0
  50. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/cli/__init__.py +0 -0
  51. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/cli/auth_commands.py +0 -0
  52. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/cli/banner.py +0 -0
  53. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/compat/__init__.py +0 -0
  54. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/compat/canonical.py +0 -0
  55. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/compat/session_store.py +0 -0
  56. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/config/__init__.py +0 -0
  57. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/config/auth_schema.py +0 -0
  58. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/config/config.default.yaml +0 -0
  59. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/config/loader.py +0 -0
  60. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/config/resiliency.py +0 -0
  61. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/config/routing.py +0 -0
  62. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/config/schema.py +0 -0
  63. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/config/server.py +0 -0
  64. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/config/session_policy.py +0 -0
  65. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/config/vendors.py +0 -0
  66. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/convert/__init__.py +0 -0
  67. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/convert/anthropic_to_gemini.py +0 -0
  68. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/convert/anthropic_to_openai.py +0 -0
  69. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/convert/gemini_sse_adapter.py +0 -0
  70. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/convert/gemini_to_anthropic.py +0 -0
  71. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/convert/openai_to_anthropic.py +0 -0
  72. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/convert/vendor_channels.py +0 -0
  73. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/logging/__init__.py +0 -0
  74. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/logging/db.py +0 -0
  75. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/logging/formatters.py +0 -0
  76. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/logging/stats.py +0 -0
  77. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/model/__init__.py +0 -0
  78. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/model/auth.py +0 -0
  79. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/model/compat.py +0 -0
  80. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/model/constants.py +0 -0
  81. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/model/pricing.py +0 -0
  82. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/model/token.py +0 -0
  83. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/model/vendor.py +0 -0
  84. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/native_api/__init__.py +0 -0
  85. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/native_api/config.py +0 -0
  86. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/native_api/extractors/__init__.py +0 -0
  87. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/native_api/extractors/anthropic.py +0 -0
  88. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/native_api/extractors/gemini.py +0 -0
  89. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/native_api/extractors/openai.py +0 -0
  90. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/native_api/handler.py +0 -0
  91. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/native_api/operation.py +0 -0
  92. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/native_api/routes.py +0 -0
  93. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/native_api/usage_registry.py +0 -0
  94. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/pricing.py +0 -0
  95. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/__init__.py +0 -0
  96. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/circuit_breaker.py +0 -0
  97. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/error_classifier.py +0 -0
  98. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/model_mapper.py +0 -0
  99. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/quota_guard.py +0 -0
  100. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/rate_limit.py +0 -0
  101. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/retry.py +0 -0
  102. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/router.py +0 -0
  103. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/session_manager.py +0 -0
  104. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/session_policy.py +0 -0
  105. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/tier.py +0 -0
  106. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/usage_parser.py +0 -0
  107. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/routing/usage_recorder.py +0 -0
  108. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/server/__init__.py +0 -0
  109. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/server/app.py +0 -0
  110. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/server/factory.py +0 -0
  111. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/server/responses.py +0 -0
  112. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/server/routes.py +0 -0
  113. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/streaming/__init__.py +0 -0
  114. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/streaming/anthropic_compat.py +0 -0
  115. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/__init__.py +0 -0
  116. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/alibaba.py +0 -0
  117. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/anthropic.py +0 -0
  118. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/antigravity.py +0 -0
  119. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/base.py +0 -0
  120. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/concurrency.py +0 -0
  121. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/copilot.py +0 -0
  122. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/copilot_models.py +0 -0
  123. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/copilot_token_manager.py +0 -0
  124. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/copilot_urls.py +0 -0
  125. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/doubao.py +0 -0
  126. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/kimi.py +0 -0
  127. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/minimax.py +0 -0
  128. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/mixins.py +0 -0
  129. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/native_anthropic.py +0 -0
  130. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/token_manager.py +0 -0
  131. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/xiaomi.py +0 -0
  132. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/src/coding/proxy/vendors/zhipu.py +0 -0
  133. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/__init__.py +0 -0
  134. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/e2e/__init__.py +0 -0
  135. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/e2e/conftest.py +0 -0
  136. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/e2e/test_e2e_http.py +0 -0
  137. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/e2e/test_e2e_token.py +0 -0
  138. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/e2e/test_e2e_vendor.py +0 -0
  139. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_antigravity.py +0 -0
  140. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_app_routes.py +0 -0
  141. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_auto_login.py +0 -0
  142. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_banner.py +0 -0
  143. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_circuit_breaker.py +0 -0
  144. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_cli_usage.py +0 -0
  145. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_compat.py +0 -0
  146. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_concurrency_monitor.py +0 -0
  147. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_config_init.py +0 -0
  148. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_config_loader.py +0 -0
  149. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_convert_request.py +0 -0
  150. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_convert_response.py +0 -0
  151. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_convert_sse.py +0 -0
  152. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_copilot.py +0 -0
  153. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_copilot_convert_request.py +0 -0
  154. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_copilot_convert_response.py +0 -0
  155. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_copilot_models.py +0 -0
  156. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_copilot_urls.py +0 -0
  157. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_currency.py +0 -0
  158. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_error_classifier.py +0 -0
  159. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_executor_in_flight_tracking.py +0 -0
  160. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_logging_dual_write.py +0 -0
  161. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_mixins.py +0 -0
  162. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_model_auth.py +0 -0
  163. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_model_compat.py +0 -0
  164. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_model_constants.py +0 -0
  165. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_model_mapper.py +0 -0
  166. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_model_pricing.py +0 -0
  167. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_model_token.py +0 -0
  168. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_model_vendor.py +0 -0
  169. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_native_api_base_url_override.py +0 -0
  170. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_native_api_extractors.py +0 -0
  171. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_native_api_handler.py +0 -0
  172. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_native_api_operation.py +0 -0
  173. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_native_api_routes.py +0 -0
  174. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_native_vendors.py +0 -0
  175. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_parse_usage.py +0 -0
  176. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_parse_usage_gemini.py +0 -0
  177. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_pricing.py +0 -0
  178. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_quota_guard.py +0 -0
  179. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_rate_limit.py +0 -0
  180. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_router_chain.py +0 -0
  181. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_runtime_reauth.py +0 -0
  182. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_schema.py +0 -0
  183. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_session_aware.py +0 -0
  184. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_streaming_anthropic_compat.py +0 -0
  185. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_tier.py +0 -0
  186. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_tiers_config.py +0 -0
  187. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_time_range.py +0 -0
  188. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_token_logger.py +0 -0
  189. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_token_logger_native_columns.py +0 -0
  190. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_token_manager.py +0 -0
  191. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_types.py +0 -0
  192. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_vendor_channels.py +0 -0
  193. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_vendor_streaming.py +0 -0
  194. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_vendors.py +0 -0
  195. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_zhipu.py +0 -0
  196. {coding_proxy-0.5.1a3 → coding_proxy-0.5.1a4}/tests/test_zhipu_concurrency.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coding-proxy
3
- Version: 0.5.1a3
3
+ Version: 0.5.1a4
4
4
  Summary: A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao...
5
5
  Project-URL: Source Code, https://github.com/ThreeFish-AI/coding-proxy
6
6
  Project-URL: User Guide, https://github.com/ThreeFish-AI/coding-proxy/blob/master/docs/user-guide.md
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "coding-proxy"
3
- version = "0.5.1a3"
3
+ version = "0.5.1a4"
4
4
  description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -54,7 +54,7 @@ from ..model.compat import CanonicalRequest
54
54
 
55
55
  logger = logging.getLogger(__name__)
56
56
 
57
- _SESSION_TITLE_MAX_LEN = 30
57
+ _SESSION_TITLE_MAX_LEN = 600
58
58
 
59
59
  # Claude Code 注入的"噪声"标签 — 系统级上下文,不应进入 Session 标题。
60
60
  # 这些标签由 CC harness 在首个 user 消息 content 中拼接,高度同质,
@@ -63,7 +63,7 @@ _NOISE_TAG_PATTERN = re.compile(
63
63
  r"<(?P<tag>system-reminder|user-preferences|"
64
64
  r"local-command-stdout|local-command-stderr|"
65
65
  r"bash-input|bash-stdout|bash-stderr|"
66
- r"ide_selection|stdin|system_instruction)\b[^>]*>"
66
+ r"ide_selection|stdin|system_instruction|session)\b[^>]*>"
67
67
  r".*?</(?P=tag)>",
68
68
  flags=re.DOTALL | re.IGNORECASE,
69
69
  )
@@ -444,6 +444,21 @@ _DASHBOARD_HTML = """<!DOCTYPE html>
444
444
  .detail-card .detail-item { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
445
445
  .detail-card .detail-label { font-size: 11px; color: var(--text-tertiary); text-transform: uppercase; letter-spacing: .3px; }
446
446
  .detail-card .detail-value { color: var(--text-primary); line-height: 1.4; word-break: break-all; overflow-wrap: break-word; }
447
+ .detail-title-row {
448
+ padding-bottom: 10px; margin-bottom: 10px;
449
+ border-bottom: 1px solid var(--border);
450
+ }
451
+ .detail-title-row .detail-value {
452
+ white-space: normal;
453
+ word-break: break-word;
454
+ overflow-wrap: break-word;
455
+ line-height: 1.5;
456
+ max-height: 4.5em;
457
+ overflow: hidden;
458
+ display: -webkit-box;
459
+ -webkit-line-clamp: 3;
460
+ -webkit-box-orient: vertical;
461
+ }
447
462
  .detail-identity-row {
448
463
  display: flex; gap: 16px;
449
464
  padding-bottom: 10px; margin-bottom: 10px;
@@ -1903,9 +1918,11 @@ function renderSessionPage() {
1903
1918
  '<td>' + formatCategories(s.client_categories) + '</td>' +
1904
1919
  '</tr>' +
1905
1920
  '<tr class="row-detail"><td colspan="11"><div class="detail-card">' +
1921
+ '<div class="detail-title-row">' +
1922
+ '<div class="detail-item"><div class="detail-label">Title</div><div class="detail-value">' + (sessionTitle ? escapeHtml(sessionTitle) : '–') + '</div></div>' +
1923
+ '</div>' +
1906
1924
  '<div class="detail-identity-row">' +
1907
1925
  '<div class="detail-item"><div class="detail-label">Session ID</div><div class="detail-value" title="' + escapeHtml(s.session_key) + '">' + escapeHtml(parsed.session_id || s.session_key) + '</div></div>' +
1908
- '<div class="detail-item"><div class="detail-label">Title</div><div class="detail-value">' + (sessionTitle ? escapeHtml(sessionTitle) : '–') + '</div></div>' +
1909
1926
  '<div class="detail-item"><div class="detail-label">Device</div><div class="detail-value" title="' + escapeHtml(parsed.device_id || '') + '">' + (parsed.device_id ? escapeHtml(parsed.device_id) : '–') + '</div></div>' +
1910
1927
  '<div class="detail-item"><div class="detail-label">Account</div><div class="detail-value" title="' + escapeHtml(parsed.account_uuid || '') + '">' + (parsed.account_uuid ? escapeHtml(parsed.account_uuid) : '–') + '</div></div>' +
1911
1928
  '</div>' +
@@ -2249,6 +2249,15 @@ class TestSanitizeUserText:
2249
2249
  raw = "<local-command-stdout>build ok</local-command-stdout>构建后的下一步问题"
2250
2250
  assert _sanitize_user_text(raw) == "构建后的下一步问题"
2251
2251
 
2252
+ def test_strips_session_tag(self):
2253
+ """``<session>`` 标签应被完整剥离,不残留在标题中."""
2254
+ raw = "<session>session metadata</session>用户真实输入文本"
2255
+ assert _sanitize_user_text(raw) == "用户真实输入文本"
2256
+
2257
+ def test_strips_session_tag_multiline(self):
2258
+ raw = "<session>\nline1\nline2\n</session>真实标题"
2259
+ assert _sanitize_user_text(raw) == "真实标题"
2260
+
2252
2261
 
2253
2262
  class TestExtractSessionTitle:
2254
2263
  """``_extract_session_title`` — 端到端从 CanonicalRequest 抽取标题."""
@@ -2258,7 +2267,7 @@ class TestExtractSessionTitle:
2258
2267
  return build_canonical_request({"model": "test", "messages": messages}, {})
2259
2268
 
2260
2269
  def test_truncates_to_max_len(self):
2261
- long_text = "用户输入文本" * 20
2270
+ long_text = "用户输入文本" * 200
2262
2271
  req = self._build_request([{"role": "user", "content": long_text}])
2263
2272
  title = _extract_session_title(req)
2264
2273
  assert len(title) == _SESSION_TITLE_MAX_LEN
@@ -74,7 +74,7 @@ wheels = [
74
74
 
75
75
  [[package]]
76
76
  name = "coding-proxy"
77
- version = "0.5.1a3"
77
+ version = "0.5.1a4"
78
78
  source = { editable = "." }
79
79
  dependencies = [
80
80
  { name = "aiosqlite" },
File without changes
File without changes
File without changes
File without changes