ccproxy-api 0.2.0a4__tar.gz → 0.2.3__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 (421) hide show
  1. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/PKG-INFO +4 -3
  2. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/README.md +2 -2
  3. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/_version.py +2 -2
  4. ccproxy_api-0.2.3/ccproxy/llms/formatters/anthropic_to_openai/_helpers.py +44 -0
  5. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/anthropic_to_openai/responses.py +19 -2
  6. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/anthropic_to_openai/streams.py +9 -17
  7. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/adapter.py +5 -0
  8. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_claude/storage.py +103 -8
  9. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/pyproject.toml +2 -1
  10. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/.gitignore +0 -0
  11. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/LICENSE +0 -0
  12. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/__main__.py +0 -0
  13. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/__init__.py +0 -0
  14. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/app.py +0 -0
  15. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/bootstrap.py +0 -0
  16. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/decorators.py +0 -0
  17. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/dependencies.py +0 -0
  18. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/format_validation.py +0 -0
  19. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/middleware/__init__.py +0 -0
  20. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/middleware/cors.py +0 -0
  21. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/middleware/errors.py +0 -0
  22. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/middleware/hooks.py +0 -0
  23. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/middleware/normalize_headers.py +0 -0
  24. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/middleware/request_id.py +0 -0
  25. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/middleware/streaming_hooks.py +0 -0
  26. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/routes/__init__.py +0 -0
  27. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/routes/health.py +0 -0
  28. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/api/routes/plugins.py +0 -0
  29. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/__init__.py +0 -0
  30. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/bearer.py +0 -0
  31. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/dependencies.py +0 -0
  32. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/exceptions.py +0 -0
  33. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/manager.py +0 -0
  34. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/managers/__init__.py +0 -0
  35. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/managers/base.py +0 -0
  36. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/managers/base_enhanced.py +0 -0
  37. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/managers/token_snapshot.py +0 -0
  38. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/models/__init__.py +0 -0
  39. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/models/base.py +0 -0
  40. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/models/credentials.py +0 -0
  41. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/oauth/__init__.py +0 -0
  42. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/oauth/base.py +0 -0
  43. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/oauth/cli_errors.py +0 -0
  44. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/oauth/flows.py +0 -0
  45. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/oauth/protocol.py +0 -0
  46. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/oauth/registry.py +0 -0
  47. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/oauth/router.py +0 -0
  48. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/oauth/routes.py +0 -0
  49. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/oauth/session.py +0 -0
  50. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/oauth/templates.py +0 -0
  51. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/storage/__init__.py +0 -0
  52. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/storage/base.py +0 -0
  53. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/auth/storage/generic.py +0 -0
  54. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/__init__.py +0 -0
  55. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/_settings_help.py +0 -0
  56. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/commands/__init__.py +0 -0
  57. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/commands/auth.py +0 -0
  58. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/commands/config/__init__.py +0 -0
  59. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/commands/config/commands.py +0 -0
  60. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/commands/config/schema_commands.py +0 -0
  61. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/commands/plugins.py +0 -0
  62. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/commands/serve.py +0 -0
  63. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/commands/status.py +0 -0
  64. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/decorators.py +0 -0
  65. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/helpers.py +0 -0
  66. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/main.py +0 -0
  67. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/options/__init__.py +0 -0
  68. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/options/claude_options.py +0 -0
  69. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/options/core_options.py +0 -0
  70. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/options/security_options.py +0 -0
  71. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/cli/options/server_options.py +0 -0
  72. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/config/__init__.py +0 -0
  73. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/config/core.py +0 -0
  74. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/config/env_generator.py +0 -0
  75. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/config/runtime.py +0 -0
  76. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/config/security.py +0 -0
  77. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/config/settings.py +0 -0
  78. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/config/toml_generator.py +0 -0
  79. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/config/utils.py +0 -0
  80. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/__init__.py +0 -0
  81. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/async_task_manager.py +0 -0
  82. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/async_utils.py +0 -0
  83. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/auth/__init__.py +0 -0
  84. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/constants.py +0 -0
  85. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/errors.py +0 -0
  86. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/id_utils.py +0 -0
  87. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/interfaces.py +0 -0
  88. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/logging.py +0 -0
  89. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/middleware.py +0 -0
  90. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/__init__.py +0 -0
  91. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/cli_discovery.py +0 -0
  92. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/declaration.py +0 -0
  93. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/discovery.py +0 -0
  94. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/factories.py +0 -0
  95. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/__init__.py +0 -0
  96. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/base.py +0 -0
  97. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/events.py +0 -0
  98. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/implementations/__init__.py +0 -0
  99. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/implementations/formatters/__init__.py +0 -0
  100. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/implementations/formatters/json.py +0 -0
  101. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/implementations/formatters/raw.py +0 -0
  102. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/implementations/http_tracer.py +0 -0
  103. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/layers.py +0 -0
  104. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/manager.py +0 -0
  105. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/registry.py +0 -0
  106. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/thread_manager.py +0 -0
  107. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/hooks/types.py +0 -0
  108. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/interfaces.py +0 -0
  109. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/loader.py +0 -0
  110. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/middleware.py +0 -0
  111. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/models.py +0 -0
  112. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/protocol.py +0 -0
  113. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/plugins/runtime.py +0 -0
  114. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/request_context.py +0 -0
  115. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/status_report.py +0 -0
  116. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/system.py +0 -0
  117. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/transformers.py +0 -0
  118. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/core/types.py +0 -0
  119. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/data/claude_headers_fallback.json +0 -0
  120. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/data/codex_headers_fallback.json +0 -0
  121. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/http/__init__.py +0 -0
  122. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/http/base.py +0 -0
  123. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/http/client.py +0 -0
  124. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/http/hooks.py +0 -0
  125. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/http/pool.py +0 -0
  126. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/__init__.py +0 -0
  127. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/anthropic_to_openai/__init__.py +0 -0
  128. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/anthropic_to_openai/errors.py +0 -0
  129. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/anthropic_to_openai/requests.py +0 -0
  130. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/base.py +0 -0
  131. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/base_model.py +0 -0
  132. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/common/__init__.py +0 -0
  133. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/common/identifiers.py +0 -0
  134. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/common/streams.py +0 -0
  135. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/common/thinking.py +0 -0
  136. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/common/usage.py +0 -0
  137. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/constants.py +0 -0
  138. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/context.py +0 -0
  139. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/mapping.py +0 -0
  140. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_anthropic/__init__.py +0 -0
  141. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_anthropic/_helpers.py +0 -0
  142. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_anthropic/errors.py +0 -0
  143. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_anthropic/requests.py +0 -0
  144. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_anthropic/responses.py +0 -0
  145. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_anthropic/streams.py +0 -0
  146. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_openai/__init__.py +0 -0
  147. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_openai/_helpers.py +0 -0
  148. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_openai/errors.py +0 -0
  149. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_openai/requests.py +0 -0
  150. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_openai/responses.py +0 -0
  151. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/openai_to_openai/streams.py +0 -0
  152. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/formatters/utils.py +0 -0
  153. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/models/__init__.py +0 -0
  154. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/models/anthropic.py +0 -0
  155. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/models/openai.py +0 -0
  156. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/streaming/__init__.py +0 -0
  157. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/streaming/accumulators.py +0 -0
  158. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/streaming/formatters.py +0 -0
  159. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/llms/streaming/processors.py +0 -0
  160. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/models/__init__.py +0 -0
  161. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/models/detection.py +0 -0
  162. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/models/provider.py +0 -0
  163. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/access_log/README.md +0 -0
  164. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/access_log/__init__.py +0 -0
  165. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/access_log/config.py +0 -0
  166. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/access_log/formatter.py +0 -0
  167. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/access_log/hook.py +0 -0
  168. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/access_log/logger.py +0 -0
  169. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/access_log/plugin.py +0 -0
  170. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/access_log/writer.py +0 -0
  171. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/analytics/README.md +0 -0
  172. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/analytics/__init__.py +0 -0
  173. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/analytics/config.py +0 -0
  174. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/analytics/ingest.py +0 -0
  175. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/analytics/models.py +0 -0
  176. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/analytics/plugin.py +0 -0
  177. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/analytics/routes.py +0 -0
  178. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/analytics/service.py +0 -0
  179. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/README.md +0 -0
  180. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/__init__.py +0 -0
  181. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/config.py +0 -0
  182. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/detection_service.py +0 -0
  183. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/health.py +0 -0
  184. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/hooks.py +0 -0
  185. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/models.py +0 -0
  186. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/plugin.py +0 -0
  187. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/routes.py +0 -0
  188. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/streaming_metrics.py +0 -0
  189. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_api/tasks.py +0 -0
  190. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/README.md +0 -0
  191. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/__init__.py +0 -0
  192. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/adapter.py +0 -0
  193. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/auth.py +0 -0
  194. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/client.py +0 -0
  195. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/config.py +0 -0
  196. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/converter.py +0 -0
  197. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/detection_service.py +0 -0
  198. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/exceptions.py +0 -0
  199. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/handler.py +0 -0
  200. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/health.py +0 -0
  201. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/hooks.py +0 -0
  202. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/manager.py +0 -0
  203. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/message_queue.py +0 -0
  204. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/models.py +0 -0
  205. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/options.py +0 -0
  206. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/parser.py +0 -0
  207. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/plugin.py +0 -0
  208. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/routes.py +0 -0
  209. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/session_client.py +0 -0
  210. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/session_pool.py +0 -0
  211. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/stream_handle.py +0 -0
  212. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/stream_worker.py +0 -0
  213. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/streaming.py +0 -0
  214. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_sdk/tasks.py +0 -0
  215. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_shared/README.md +0 -0
  216. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_shared/__init__.py +0 -0
  217. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/claude_shared/model_defaults.py +0 -0
  218. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/README.md +0 -0
  219. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/__init__.py +0 -0
  220. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/adapter.py +0 -0
  221. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/config.py +0 -0
  222. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/detection_service.py +0 -0
  223. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/health.py +0 -0
  224. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/hooks.py +0 -0
  225. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/model_defaults.py +0 -0
  226. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/models.py +0 -0
  227. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/plugin.py +0 -0
  228. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/routes.py +0 -0
  229. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/streaming_metrics.py +0 -0
  230. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/tasks.py +0 -0
  231. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/utils/__init__.py +0 -0
  232. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/codex/utils/sse_parser.py +0 -0
  233. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/command_replay/README.md +0 -0
  234. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/command_replay/__init__.py +0 -0
  235. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/command_replay/config.py +0 -0
  236. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/command_replay/formatter.py +0 -0
  237. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/command_replay/hook.py +0 -0
  238. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/command_replay/plugin.py +0 -0
  239. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/README.md +0 -0
  240. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/__init__.py +0 -0
  241. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/adapter.py +0 -0
  242. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/config.py +0 -0
  243. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/data/copilot_fallback.json +0 -0
  244. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/detection_service.py +0 -0
  245. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/manager.py +0 -0
  246. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/model_defaults.py +0 -0
  247. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/models.py +0 -0
  248. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/oauth/__init__.py +0 -0
  249. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/oauth/client.py +0 -0
  250. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/oauth/models.py +0 -0
  251. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/oauth/provider.py +0 -0
  252. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/oauth/storage.py +0 -0
  253. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/plugin.py +0 -0
  254. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/copilot/routes.py +0 -0
  255. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/credential_balancer/README.md +0 -0
  256. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/credential_balancer/__init__.py +0 -0
  257. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/credential_balancer/config.py +0 -0
  258. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/credential_balancer/factory.py +0 -0
  259. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/credential_balancer/hook.py +0 -0
  260. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/credential_balancer/manager.py +0 -0
  261. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/credential_balancer/plugin.py +0 -0
  262. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/dashboard/README.md +0 -0
  263. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/dashboard/__init__.py +0 -0
  264. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/dashboard/config.py +0 -0
  265. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/dashboard/plugin.py +0 -0
  266. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/dashboard/routes.py +0 -0
  267. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/README.md +0 -0
  268. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/__init__.py +0 -0
  269. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/adapter.py +0 -0
  270. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/config.py +0 -0
  271. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/docker_path.py +0 -0
  272. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/middleware.py +0 -0
  273. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/models.py +0 -0
  274. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/plugin.py +0 -0
  275. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/protocol.py +0 -0
  276. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/stream_process.py +0 -0
  277. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/docker/validators.py +0 -0
  278. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/duckdb_storage/README.md +0 -0
  279. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/duckdb_storage/__init__.py +0 -0
  280. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/duckdb_storage/config.py +0 -0
  281. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/duckdb_storage/plugin.py +0 -0
  282. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/duckdb_storage/routes.py +0 -0
  283. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/duckdb_storage/storage.py +0 -0
  284. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/max_tokens/README.md +0 -0
  285. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/max_tokens/__init__.py +0 -0
  286. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/max_tokens/adapter.py +0 -0
  287. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/max_tokens/config.py +0 -0
  288. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/max_tokens/models.py +0 -0
  289. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/max_tokens/plugin.py +0 -0
  290. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/max_tokens/service.py +0 -0
  291. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/max_tokens/token_limits.json +0 -0
  292. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/metrics/README.md +0 -0
  293. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/metrics/__init__.py +0 -0
  294. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/metrics/collector.py +0 -0
  295. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/metrics/config.py +0 -0
  296. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/metrics/grafana/dashboards/ccproxy-dashboard.json +0 -0
  297. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/metrics/hook.py +0 -0
  298. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/metrics/plugin.py +0 -0
  299. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/metrics/pushgateway.py +0 -0
  300. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/metrics/routes.py +0 -0
  301. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/metrics/tasks.py +0 -0
  302. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_claude/README.md +0 -0
  303. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_claude/__init__.py +0 -0
  304. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_claude/client.py +0 -0
  305. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_claude/config.py +0 -0
  306. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_claude/manager.py +0 -0
  307. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_claude/models.py +0 -0
  308. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_claude/plugin.py +0 -0
  309. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_claude/provider.py +0 -0
  310. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_codex/README.md +0 -0
  311. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_codex/__init__.py +0 -0
  312. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_codex/client.py +0 -0
  313. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_codex/config.py +0 -0
  314. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_codex/manager.py +0 -0
  315. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_codex/models.py +0 -0
  316. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_codex/plugin.py +0 -0
  317. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_codex/provider.py +0 -0
  318. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/oauth_codex/storage.py +0 -0
  319. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/README.md +0 -0
  320. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/__init__.py +0 -0
  321. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/config.py +0 -0
  322. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/handlers/__init__.py +0 -0
  323. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/handlers/cli.py +0 -0
  324. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/handlers/protocol.py +0 -0
  325. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/handlers/terminal.py +0 -0
  326. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/mcp.py +0 -0
  327. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/models.py +0 -0
  328. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/plugin.py +0 -0
  329. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/routes.py +0 -0
  330. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/service.py +0 -0
  331. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/ui/__init__.py +0 -0
  332. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/ui/permission_handler_protocol.py +0 -0
  333. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/permissions/ui/terminal_permission_handler.py +0 -0
  334. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/README.md +0 -0
  335. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/__init__.py +0 -0
  336. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/cache.py +0 -0
  337. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/config.py +0 -0
  338. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/exceptions.py +0 -0
  339. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/loader.py +0 -0
  340. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/models.py +0 -0
  341. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/plugin.py +0 -0
  342. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/service.py +0 -0
  343. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/tasks.py +0 -0
  344. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/updater.py +0 -0
  345. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/pricing/utils.py +0 -0
  346. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/request_tracer/README.md +0 -0
  347. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/request_tracer/__init__.py +0 -0
  348. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/request_tracer/config.py +0 -0
  349. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/request_tracer/hook.py +0 -0
  350. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/plugins/request_tracer/plugin.py +0 -0
  351. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/scheduler/__init__.py +0 -0
  352. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/scheduler/core.py +0 -0
  353. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/scheduler/errors.py +0 -0
  354. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/scheduler/manager.py +0 -0
  355. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/scheduler/registry.py +0 -0
  356. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/scheduler/tasks.py +0 -0
  357. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/__init__.py +0 -0
  358. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/__init__.py +0 -0
  359. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/base.py +0 -0
  360. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/chain_composer.py +0 -0
  361. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/chain_validation.py +0 -0
  362. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/chat_accumulator.py +0 -0
  363. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/delta_utils.py +0 -0
  364. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/format_adapter.py +0 -0
  365. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/format_context.py +0 -0
  366. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/format_registry.py +0 -0
  367. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/http_adapter.py +0 -0
  368. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/mock_adapter.py +0 -0
  369. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/protocols.py +0 -0
  370. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/adapters/simple_converters.py +0 -0
  371. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/auth_registry.py +0 -0
  372. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/cache/__init__.py +0 -0
  373. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/cache/response_cache.py +0 -0
  374. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/cli_detection.py +0 -0
  375. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/config/__init__.py +0 -0
  376. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/config/proxy_configuration.py +0 -0
  377. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/container.py +0 -0
  378. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/factories.py +0 -0
  379. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/handler_config.py +0 -0
  380. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/interfaces.py +0 -0
  381. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/mocking/__init__.py +0 -0
  382. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/mocking/mock_handler.py +0 -0
  383. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/tracing/__init__.py +0 -0
  384. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/tracing/interfaces.py +0 -0
  385. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/services/tracing/null_tracer.py +0 -0
  386. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/streaming/__init__.py +0 -0
  387. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/streaming/buffer.py +0 -0
  388. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/streaming/deferred.py +0 -0
  389. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/streaming/handler.py +0 -0
  390. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/streaming/interfaces.py +0 -0
  391. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/streaming/simple_adapter.py +0 -0
  392. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/streaming/sse.py +0 -0
  393. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/streaming/sse_parser.py +0 -0
  394. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/templates/__init__.py +0 -0
  395. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/templates/plugin_scaffold.py +0 -0
  396. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/__init__.py +0 -0
  397. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/config.py +0 -0
  398. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/content_generation.py +0 -0
  399. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/endpoints/__init__.py +0 -0
  400. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/endpoints/cli.py +0 -0
  401. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/endpoints/config.py +0 -0
  402. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/endpoints/console.py +0 -0
  403. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/endpoints/models.py +0 -0
  404. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/endpoints/runner.py +0 -0
  405. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/endpoints/tools.py +0 -0
  406. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/mock_responses.py +0 -0
  407. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/response_handlers.py +0 -0
  408. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/testing/scenarios.py +0 -0
  409. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/utils/__init__.py +0 -0
  410. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/utils/binary_resolver.py +0 -0
  411. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/utils/caching.py +0 -0
  412. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/utils/cli_logging.py +0 -0
  413. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/utils/command_line.py +0 -0
  414. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/utils/headers.py +0 -0
  415. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/utils/id_generator.py +0 -0
  416. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/utils/model_mapper.py +0 -0
  417. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/utils/startup_helpers.py +0 -0
  418. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/ccproxy/utils/version_checker.py +0 -0
  419. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/examples/README.md +0 -0
  420. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/tests/factories/README.md +0 -0
  421. {ccproxy_api-0.2.0a4 → ccproxy_api-0.2.3}/tests/fixtures/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ccproxy-api
3
- Version: 0.2.0a4
3
+ Version: 0.2.3
4
4
  Summary: API server that provides an Anthropic and OpenAI compatible interface over Claude Code, allowing to use your Claude OAuth account or over the API.
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -20,6 +20,7 @@ Requires-Dist: typing-extensions>=4.0.0
20
20
  Requires-Dist: uvicorn>=0.34.0
21
21
  Provides-Extra: plugins-claude
22
22
  Requires-Dist: claude-agent-sdk>=0.1.0; extra == 'plugins-claude'
23
+ Requires-Dist: keyring>=25.0.0; extra == 'plugins-claude'
23
24
  Requires-Dist: qrcode>=8.2; extra == 'plugins-claude'
24
25
  Provides-Extra: plugins-codex
25
26
  Requires-Dist: pyjwt>=2.10.1; extra == 'plugins-codex'
@@ -196,14 +197,14 @@ To install the latest stable release without cloning the repository, use `uvx`
196
197
  to grab the published wheel and launch the CLI:
197
198
 
198
199
  ```bash
199
- uvx --with "ccproxy-api[all]==0.2.0" ccproxy serve --port 8000
200
+ uvx --with "ccproxy-api[all]" ccproxy serve --port 8000
200
201
  ```
201
202
 
202
203
  If you prefer `pipx`, install the package (optionally with extras) and use the
203
204
  local shim:
204
205
 
205
206
  ```bash
206
- pipx install "ccproxy-api[all]==0.2.0"
207
+ pipx install "ccproxy-api[all]"
207
208
  ccproxy serve # default on localhost:8000
208
209
  ```
209
210
 
@@ -156,14 +156,14 @@ To install the latest stable release without cloning the repository, use `uvx`
156
156
  to grab the published wheel and launch the CLI:
157
157
 
158
158
  ```bash
159
- uvx --with "ccproxy-api[all]==0.2.0" ccproxy serve --port 8000
159
+ uvx --with "ccproxy-api[all]" ccproxy serve --port 8000
160
160
  ```
161
161
 
162
162
  If you prefer `pipx`, install the package (optionally with extras) and use the
163
163
  local shim:
164
164
 
165
165
  ```bash
166
- pipx install "ccproxy-api[all]==0.2.0"
166
+ pipx install "ccproxy-api[all]"
167
167
  ccproxy serve # default on localhost:8000
168
168
  ```
169
169
 
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.2.0a4'
32
- __version_tuple__ = version_tuple = (0, 2, 0, 'a4')
31
+ __version__ = version = '0.2.3'
32
+ __version_tuple__ = version_tuple = (0, 2, 3)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -0,0 +1,44 @@
1
+ """Shared helpers for Anthropic to OpenAI formatting."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from typing import Any
7
+
8
+ from ccproxy.llms.models import openai as openai_models
9
+
10
+
11
+ def serialize_tool_arguments(tool_input: Any) -> str:
12
+ if isinstance(tool_input, str):
13
+ return tool_input
14
+ try:
15
+ return json.dumps(tool_input, ensure_ascii=False)
16
+ except Exception:
17
+ return json.dumps({"arguments": str(tool_input)})
18
+
19
+
20
+ def build_openai_tool_call(
21
+ *,
22
+ tool_id: str | None,
23
+ tool_name: str | None,
24
+ tool_input: Any,
25
+ arguments: Any = None,
26
+ fallback_index: int = 0,
27
+ ) -> openai_models.ToolCall:
28
+ args_str = (
29
+ arguments
30
+ if isinstance(arguments, str) and arguments
31
+ else serialize_tool_arguments(tool_input)
32
+ )
33
+ call_id = (
34
+ tool_id if isinstance(tool_id, str) and tool_id else f"call_{fallback_index}"
35
+ )
36
+ name = tool_name if isinstance(tool_name, str) and tool_name else "function"
37
+
38
+ return openai_models.ToolCall(
39
+ id=str(call_id),
40
+ function=openai_models.FunctionCall(
41
+ name=str(name),
42
+ arguments=str(args_str),
43
+ ),
44
+ )
@@ -14,6 +14,8 @@ from ccproxy.llms.formatters.constants import ANTHROPIC_TO_OPENAI_FINISH_REASON
14
14
  from ccproxy.llms.models import anthropic as anthropic_models
15
15
  from ccproxy.llms.models import openai as openai_models
16
16
 
17
+ from ._helpers import build_openai_tool_call
18
+
17
19
 
18
20
  logger = ccproxy.core.logging.get_logger(__name__)
19
21
 
@@ -101,6 +103,8 @@ def convert__anthropic_message_to_openai_chat__response(
101
103
  """Convert Anthropic MessageResponse to an OpenAI ChatCompletionResponse."""
102
104
  content_blocks = response.content
103
105
  parts: list[str] = []
106
+ tool_calls: list[openai_models.ToolCall] = []
107
+
104
108
  for block in content_blocks:
105
109
  btype = getattr(block, "type", None)
106
110
  if btype == "text":
@@ -117,8 +121,17 @@ def convert__anthropic_message_to_openai_chat__response(
117
121
  else ""
118
122
  )
119
123
  parts.append(f"<thinking{sig_attr}>{thinking}</thinking>")
124
+ elif btype == "tool_use":
125
+ tool_calls.append(
126
+ build_openai_tool_call(
127
+ tool_id=getattr(block, "id", None),
128
+ tool_name=getattr(block, "name", None),
129
+ tool_input=getattr(block, "input", {}) or {},
130
+ fallback_index=len(tool_calls),
131
+ )
132
+ )
120
133
 
121
- content_text = "".join(parts)
134
+ content_text = "".join(parts) if parts else None
122
135
 
123
136
  stop_reason = response.stop_reason
124
137
  finish_reason = ANTHROPIC_TO_OPENAI_FINISH_REASON.get(
@@ -127,12 +140,16 @@ def convert__anthropic_message_to_openai_chat__response(
127
140
 
128
141
  usage_model = convert__anthropic_usage_to_openai_completion__usage(response.usage)
129
142
 
143
+ message_dict: dict[str, Any] = {"role": "assistant", "content": content_text}
144
+ if tool_calls:
145
+ message_dict["tool_calls"] = [call.model_dump() for call in tool_calls]
146
+
130
147
  payload = {
131
148
  "id": response.id,
132
149
  "choices": [
133
150
  {
134
151
  "index": 0,
135
- "message": {"role": "assistant", "content": content_text},
152
+ "message": message_dict,
136
153
  "finish_reason": finish_reason,
137
154
  }
138
155
  ],
@@ -27,10 +27,9 @@ from ccproxy.llms.models import anthropic as anthropic_models
27
27
  from ccproxy.llms.models import openai as openai_models
28
28
  from ccproxy.llms.streaming.accumulators import ClaudeAccumulator
29
29
 
30
+ from ._helpers import build_openai_tool_call
30
31
  from .requests import _build_responses_payload_from_anthropic_request
31
- from .responses import (
32
- convert__anthropic_usage_to_openai_responses__usage,
33
- )
32
+ from .responses import convert__anthropic_usage_to_openai_responses__usage
34
33
 
35
34
 
36
35
  logger = ccproxy.core.logging.get_logger(__name__)
@@ -100,22 +99,15 @@ def _build_openai_tool_call(
100
99
  function_payload = (
101
100
  tool_call.get("function", {}) if isinstance(tool_call, dict) else {}
102
101
  )
103
- name = function_payload.get("name") or tool_call.get("name") or "function"
102
+ tool_name = function_payload.get("name") or tool_call.get("name")
104
103
  arguments = function_payload.get("arguments")
105
- if not isinstance(arguments, str) or not arguments:
106
- try:
107
- arguments = json.dumps(tool_call.get("input", {}), ensure_ascii=False)
108
- except Exception:
109
- arguments = json.dumps(tool_call.get("input", {}))
110
-
111
- tool_id = tool_call.get("id") or f"call_{block_index}"
112
104
 
113
- return openai_models.ToolCall(
114
- id=str(tool_id),
115
- function=openai_models.FunctionCall(
116
- name=str(name),
117
- arguments=str(arguments),
118
- ),
105
+ return build_openai_tool_call(
106
+ tool_id=tool_call.get("id"),
107
+ tool_name=tool_name,
108
+ tool_input=tool_call.get("input", {}),
109
+ arguments=arguments,
110
+ fallback_index=block_index,
119
111
  )
120
112
 
121
113
  return None
@@ -85,6 +85,11 @@ class ClaudeAPIAdapter(BaseHTTPAdapter):
85
85
  # Always set Authorization from OAuth-managed access token
86
86
  filtered_headers["authorization"] = f"Bearer {token_value}"
87
87
 
88
+ # PATCH: Add Computer Use beta headers for Anthropic API
89
+ # These are required for browser automation tools to work
90
+ filtered_headers["anthropic-version"] = "2023-06-01"
91
+ filtered_headers["anthropic-beta"] = "computer-use-2025-01-24"
92
+
88
93
  # Add CLI headers if available, but never allow overriding auth
89
94
  cli_headers = self._collect_cli_headers()
90
95
  if cli_headers:
@@ -15,6 +15,77 @@ from .models import ClaudeCredentials, ClaudeProfileInfo
15
15
  logger = get_plugin_logger()
16
16
 
17
17
 
18
+ # Keychain service name used by Claude Code
19
+ KEYCHAIN_SERVICE = "Claude Code"
20
+ KEYCHAIN_ACCOUNT = "credentials"
21
+
22
+
23
+ def _is_keyring_available() -> bool:
24
+ """Check if keyring library is available."""
25
+ try:
26
+ import keyring # noqa: F401
27
+
28
+ return True
29
+ except ImportError:
30
+ return False
31
+
32
+
33
+ async def _read_from_keychain() -> dict[str, Any] | None:
34
+ """Read Claude credentials from system keychain.
35
+
36
+ Claude Code stores OAuth credentials in the system keychain and intentionally
37
+ deletes the plain text ~/.claude/.credentials.json file for security.
38
+ See: https://github.com/anthropics/claude-code/issues/1414
39
+
40
+ Uses the keyring library which supports:
41
+ - macOS Keychain
42
+ - Windows Credential Manager
43
+ - Linux Secret Service (GNOME Keyring, KDE Wallet)
44
+
45
+ Returns:
46
+ Parsed credentials dict or None if not found or keyring unavailable
47
+ """
48
+ if not _is_keyring_available():
49
+ logger.debug(
50
+ "keyring_not_available",
51
+ hint="Install keyring package for system keychain support",
52
+ category="auth",
53
+ )
54
+ return None
55
+
56
+ def read_keychain() -> dict[str, Any] | None:
57
+ try:
58
+ import keyring
59
+
60
+ password = keyring.get_password(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT)
61
+ if password:
62
+ parsed = json.loads(password)
63
+ if isinstance(parsed, dict):
64
+ return parsed
65
+ logger.debug(
66
+ "keychain_invalid_format",
67
+ expected="dict",
68
+ got=type(parsed).__name__,
69
+ category="auth",
70
+ )
71
+ except json.JSONDecodeError as e:
72
+ logger.debug(
73
+ "keychain_json_decode_error",
74
+ error=str(e),
75
+ category="auth",
76
+ )
77
+ except Exception as e:
78
+ logger.debug(
79
+ "keychain_read_error",
80
+ error=str(e),
81
+ error_type=type(e).__name__,
82
+ category="auth",
83
+ )
84
+ return None
85
+
86
+ return await asyncio.to_thread(read_keychain)
87
+
88
+
18
89
  class ClaudeOAuthStorage(BaseJsonStorage[ClaudeCredentials]):
19
90
  """Claude OAuth-specific token storage implementation."""
20
91
 
@@ -61,24 +132,48 @@ class ClaudeOAuthStorage(BaseJsonStorage[ClaudeCredentials]):
61
132
  return False
62
133
 
63
134
  async def load(self) -> ClaudeCredentials | None:
64
- """Load Claude credentials.
135
+ """Load Claude credentials from file or system keychain.
136
+
137
+ Claude Code stores credentials in the system keychain and intentionally
138
+ deletes the plain text file for security. This method tries file first,
139
+ then falls back to the system keychain (macOS Keychain, Windows Credential
140
+ Manager, or Linux Secret Service).
65
141
 
66
142
  Returns:
67
143
  Stored credentials or None
68
144
  """
69
145
  try:
70
- # Use parent class's read method
146
+ # Try file first (works on all platforms, manual setups)
71
147
  data = await self._read_json()
72
- if not data:
73
- return None
148
+ if data:
149
+ credentials = ClaudeCredentials.model_validate(data)
150
+ logger.debug(
151
+ "claude_oauth_credentials_loaded",
152
+ has_oauth=bool(credentials.claude_ai_oauth),
153
+ source="file",
154
+ category="auth",
155
+ )
156
+ return credentials
157
+
158
+ # Fallback to system keychain (where Claude Code stores credentials)
159
+ keychain_data = await _read_from_keychain()
160
+ if keychain_data:
161
+ credentials = ClaudeCredentials.model_validate(keychain_data)
162
+ logger.debug(
163
+ "claude_oauth_credentials_loaded",
164
+ has_oauth=bool(credentials.claude_ai_oauth),
165
+ source="keychain",
166
+ category="auth",
167
+ )
168
+ return credentials
74
169
 
75
- credentials = ClaudeCredentials.model_validate(data)
76
170
  logger.debug(
77
- "claude_oauth_credentials_loaded",
78
- has_oauth=bool(credentials.claude_ai_oauth),
171
+ "claude_oauth_credentials_not_found",
172
+ checked_file=str(self.file_path),
173
+ checked_keychain=_is_keyring_available(),
79
174
  category="auth",
80
175
  )
81
- return credentials
176
+ return None
82
177
  except Exception as e:
83
178
  logger.error(
84
179
  "claude_oauth_credentials_load_error",
@@ -92,10 +92,11 @@ dev = [
92
92
  "bandit",
93
93
  "types-aiofiles>=24.0.0",
94
94
  "types-PyYAML>=6.0.12.12",
95
+ "keyring>=25.0.0",
95
96
  ]
96
97
 
97
98
  [project.optional-dependencies]
98
- plugins-claude = ["claude-agent-sdk>=0.1.0", "qrcode>=8.2"]
99
+ plugins-claude = ["claude-agent-sdk>=0.1.0", "qrcode>=8.2", "keyring>=25.0.0"]
99
100
  plugins-codex = ["qrcode>=8.2", "pyjwt>=2.10.1"]
100
101
  plugins-storage = [
101
102
  "sqlmodel>=0.0.24",
File without changes
File without changes