coderouter-cli 2.7.6__tar.gz → 2.7.7__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 (260) hide show
  1. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/CHANGELOG.md +89 -0
  2. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/PKG-INFO +1 -1
  3. coderouter_cli-2.7.7/coderouter/adapters/agent_cli.py +591 -0
  4. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/adapters/registry.py +6 -0
  5. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/config/schemas.py +162 -3
  6. coderouter_cli-2.7.7/docs/designs/external-agents-adapter.md +606 -0
  7. coderouter_cli-2.7.7/examples/providers-agent-cli.yaml +166 -0
  8. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/pyproject.toml +1 -1
  9. coderouter_cli-2.7.7/tests/test_agent_cli.py +529 -0
  10. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/.gitignore +0 -0
  11. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/LICENSE +0 -0
  12. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/README.en.md +0 -0
  13. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/README.md +0 -0
  14. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/__init__.py +0 -0
  15. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/__main__.py +0 -0
  16. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/adapters/__init__.py +0 -0
  17. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/adapters/anthropic_native.py +0 -0
  18. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/adapters/base.py +0 -0
  19. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/adapters/openai_compat.py +0 -0
  20. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/cli.py +0 -0
  21. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/cli_stats.py +0 -0
  22. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/config/__init__.py +0 -0
  23. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/config/capability_registry.py +0 -0
  24. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/config/env_file.py +0 -0
  25. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/config/loader.py +0 -0
  26. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/cost.py +0 -0
  27. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/data/__init__.py +0 -0
  28. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/data/model-capabilities.yaml +0 -0
  29. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/doctor.py +0 -0
  30. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/doctor_apply.py +0 -0
  31. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/env_security.py +0 -0
  32. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/errors.py +0 -0
  33. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/gguf_introspect.py +0 -0
  34. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/__init__.py +0 -0
  35. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/_fingerprint.py +0 -0
  36. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/backend_health.py +0 -0
  37. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/context_budget.py +0 -0
  38. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/continuous_probe.py +0 -0
  39. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/drift_actions.py +0 -0
  40. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/drift_detection.py +0 -0
  41. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/memory_budget.py +0 -0
  42. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/memory_pressure.py +0 -0
  43. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/self_healing.py +0 -0
  44. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/guards/tool_loop.py +0 -0
  45. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/hardware.py +0 -0
  46. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/__init__.py +0 -0
  47. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/anthropic_routes.py +0 -0
  48. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/app.py +0 -0
  49. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/dashboard_routes.py +0 -0
  50. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/launcher_routes.py +0 -0
  51. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/metrics_routes.py +0 -0
  52. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/ingress/openai_routes.py +0 -0
  53. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/language_tax.py +0 -0
  54. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/launcher_speculative.py +0 -0
  55. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/logging.py +0 -0
  56. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/metrics/__init__.py +0 -0
  57. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/metrics/collector.py +0 -0
  58. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/metrics/prometheus.py +0 -0
  59. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/output_filters.py +0 -0
  60. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/plugins/__init__.py +0 -0
  61. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/plugins/base.py +0 -0
  62. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/plugins/loader.py +0 -0
  63. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/plugins/registry.py +0 -0
  64. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/__init__.py +0 -0
  65. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/adaptive.py +0 -0
  66. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/auto_router.py +0 -0
  67. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/budget.py +0 -0
  68. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/capability.py +0 -0
  69. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/routing/fallback.py +0 -0
  70. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/__init__.py +0 -0
  71. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/audit_log.py +0 -0
  72. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/replay.py +0 -0
  73. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/request_log.py +0 -0
  74. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/store.py +0 -0
  75. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/state/suggest_rules.py +0 -0
  76. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/token_estimation.py +0 -0
  77. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/token_estimation_accurate.py +0 -0
  78. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/translation/__init__.py +0 -0
  79. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/translation/anthropic.py +0 -0
  80. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/translation/convert.py +0 -0
  81. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/coderouter/translation/tool_repair.py +0 -0
  82. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/README.en.md +0 -0
  83. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/README.md +0 -0
  84. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/assets/dashboard-demo.png +0 -0
  85. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
  86. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
  87. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/gguf_dl.en.md +0 -0
  88. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/gguf_dl.md +0 -0
  89. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/hf-ollama-models.en.md +0 -0
  90. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/hf-ollama-models.md +0 -0
  91. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/install-backends.en.md +0 -0
  92. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/install-backends.md +0 -0
  93. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/launcher-quickstart.en.md +0 -0
  94. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/launcher-quickstart.md +0 -0
  95. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/launcher.en.md +0 -0
  96. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/launcher.md +0 -0
  97. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/llamacpp-direct.en.md +0 -0
  98. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/llamacpp-direct.md +0 -0
  99. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/lmstudio-direct.en.md +0 -0
  100. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/lmstudio-direct.md +0 -0
  101. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/backends/verify-ollama-0.23.1.md +0 -0
  102. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/architecture.en.md +0 -0
  103. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/architecture.md +0 -0
  104. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/context-budget.en.md +0 -0
  105. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/context-budget.md +0 -0
  106. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/continuous-probing.en.md +0 -0
  107. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/continuous-probing.md +0 -0
  108. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/drift-detection.en.md +0 -0
  109. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/drift-detection.md +0 -0
  110. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/partial-stitch.en.md +0 -0
  111. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/concepts/partial-stitch.md +0 -0
  112. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/designs/v1.5-dashboard-mockup.html +0 -0
  113. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/designs/v1.6-auto-router-verification.md +0 -0
  114. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/designs/v1.6-auto-router.md +0 -0
  115. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/free-tier-guide.en.md +0 -0
  116. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/free-tier-guide.md +0 -0
  117. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/language-tax.en.md +0 -0
  118. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/language-tax.md +0 -0
  119. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/remote-access.en.md +0 -0
  120. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/remote-access.md +0 -0
  121. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/security.en.md +0 -0
  122. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/security.md +0 -0
  123. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/troubleshooting.en.md +0 -0
  124. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/troubleshooting.md +0 -0
  125. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/usage-guide.en.md +0 -0
  126. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/guides/usage-guide.md +0 -0
  127. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/low-memory-integration.en.md +0 -0
  128. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/low-memory-integration.md +0 -0
  129. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/openrouter-roster/CHANGES.md +0 -0
  130. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/openrouter-roster/README.md +0 -0
  131. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/openrouter-roster/latest.json +0 -0
  132. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v0.4.md +0 -0
  133. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v0.5-verify.md +0 -0
  134. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v0.5.md +0 -0
  135. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v0.6.md +0 -0
  136. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v0.7.md +0 -0
  137. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v1.0-verify.md +0 -0
  138. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/retrospectives/v1.0.md +0 -0
  139. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/start/quickstart.en.md +0 -0
  140. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/start/quickstart.md +0 -0
  141. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/start/when-do-i-need-coderouter.en.md +0 -0
  142. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/docs/start/when-do-i-need-coderouter.md +0 -0
  143. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/.env.example +0 -0
  144. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/README.md +0 -0
  145. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers-multiagent.yaml +0 -0
  146. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.context-budget-test.yaml +0 -0
  147. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.llamacpp-vllm.yaml +0 -0
  148. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.nvidia-nim.yaml +0 -0
  149. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.ollama-auto-custom.yaml +0 -0
  150. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.ollama-auto.yaml +0 -0
  151. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.ollama-free-chain.yaml +0 -0
  152. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.raspberrypi.yaml +0 -0
  153. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/examples/providers.yaml +0 -0
  154. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/demo_traffic.sh +0 -0
  155. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/openrouter_roster_diff.py +0 -0
  156. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/smoke_v2_2.sh +0 -0
  157. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/verify-providers.yaml +0 -0
  158. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/verify_ollama_0_23.py +0 -0
  159. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/verify_v0_5.sh +0 -0
  160. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/scripts/verify_v1_0.sh +0 -0
  161. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/__init__.py +0 -0
  162. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/conftest.py +0 -0
  163. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_adapter_anthropic.py +0 -0
  164. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_audit_log.py +0 -0
  165. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_auto_router.py +0 -0
  166. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_auto_router_cjk.py +0 -0
  167. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_backend_health.py +0 -0
  168. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_budget.py +0 -0
  169. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_capability.py +0 -0
  170. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_capability_degraded_payload.py +0 -0
  171. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_capability_registry.py +0 -0
  172. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_capability_registry_cache_control.py +0 -0
  173. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_capability_tool_choice.py +0 -0
  174. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_claude_code_suitability.py +0 -0
  175. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_cli.py +0 -0
  176. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_cli_bind_warning.py +0 -0
  177. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_cli_stats.py +0 -0
  178. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_config.py +0 -0
  179. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_config_shim_actions.py +0 -0
  180. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_context_budget.py +0 -0
  181. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_continuous_probe.py +0 -0
  182. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_dashboard_endpoint.py +0 -0
  183. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_doctor.py +0 -0
  184. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_doctor_apply.py +0 -0
  185. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_doctor_cache_probe.py +0 -0
  186. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_drift_actions.py +0 -0
  187. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_drift_detection.py +0 -0
  188. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_drift_detection_integration.py +0 -0
  189. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_env_file.py +0 -0
  190. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_env_security.py +0 -0
  191. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_errors.py +0 -0
  192. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_examples_yaml.py +0 -0
  193. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback.py +0 -0
  194. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_anthropic.py +0 -0
  195. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_cache_control.py +0 -0
  196. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_cache_observed.py +0 -0
  197. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_cache_strip.py +0 -0
  198. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_empty_response.py +0 -0
  199. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_misconfig_warn.py +0 -0
  200. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_paid_gate.py +0 -0
  201. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_thinking.py +0 -0
  202. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fallback_tool_choice_emulate.py +0 -0
  203. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h1_prometheus_drift.py +0 -0
  204. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h2_h6_translation.py +0 -0
  205. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h3_client_reuse.py +0 -0
  206. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h4_h5_guards.py +0 -0
  207. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h7_probe_restore.py +0 -0
  208. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_h8_launcher_auth.py +0 -0
  209. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mA_routing.py +0 -0
  210. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mB_adapters.py +0 -0
  211. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mC_convert.py +0 -0
  212. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mD_logging_metrics.py +0 -0
  213. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mE_config_validation.py +0 -0
  214. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_fix_mF_ingress.py +0 -0
  215. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_gguf_introspect.py +0 -0
  216. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_guards_tool_loop.py +0 -0
  217. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_hardware.py +0 -0
  218. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_ingress_anthropic.py +0 -0
  219. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_ingress_count_tokens.py +0 -0
  220. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_ingress_profile.py +0 -0
  221. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_language_tax.py +0 -0
  222. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_language_tax_integration.py +0 -0
  223. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_launcher_mtp.py +0 -0
  224. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_launcher_mtp_fallback.py +0 -0
  225. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_launcher_provider_sync.py +0 -0
  226. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_memory_budget.py +0 -0
  227. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_memory_pressure.py +0 -0
  228. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_cache.py +0 -0
  229. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_collector.py +0 -0
  230. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_cost.py +0 -0
  231. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_endpoint.py +0 -0
  232. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_jsonl.py +0 -0
  233. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_prometheus.py +0 -0
  234. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_metrics_prometheus_cache.py +0 -0
  235. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_models_passthrough.py +0 -0
  236. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_openai_compat.py +0 -0
  237. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_openrouter_roster_diff.py +0 -0
  238. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_output_filters.py +0 -0
  239. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_output_filters_adapters.py +0 -0
  240. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_partial_stitch.py +0 -0
  241. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_plugins_integration.py +0 -0
  242. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_plugins_loader.py +0 -0
  243. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_plugins_registry.py +0 -0
  244. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_reasoning_strip.py +0 -0
  245. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_repair_byte_fallback.py +0 -0
  246. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_request_log.py +0 -0
  247. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_role_normalization.py +0 -0
  248. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_routing_adaptive.py +0 -0
  249. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_self_healing.py +0 -0
  250. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_setup_sh.py +0 -0
  251. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_state_store.py +0 -0
  252. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_token_estimation.py +0 -0
  253. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_token_estimation_accurate.py +0 -0
  254. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_tokens_saved_metric.py +0 -0
  255. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_tool_repair.py +0 -0
  256. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_tool_repair_lenient.py +0 -0
  257. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_tool_repair_r4.py +0 -0
  258. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_toolrepair_bench.py +0 -0
  259. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_translation_anthropic.py +0 -0
  260. {coderouter_cli-2.7.6 → coderouter_cli-2.7.7}/tests/test_translation_reverse.py +0 -0
@@ -9,6 +9,95 @@ are kept verbatim where the Japanese text itself is the subject).
9
9
 
10
10
  ---
11
11
 
12
+ ## [v2.7.7] — 2026-07-10 (External coding agents: agent_cli adapter, Phase 1a claude)
13
+
14
+ **PR #62 / #63**. Adds a new adapter kind, `agent_cli`, that lets CodeRouter front an external
15
+ coding-agent CLI (Claude Code / Codex / Gemini / Grok) as a single one-shot
16
+ `prompt in → text out` transformation, keeping the "one request = one
17
+ stateless transformation" ethos intact even though the underlying CLI is a
18
+ stateful, multi-turn, filesystem-editing control loop. Phase 1a implements
19
+ only the `claude` target (Claude Code CLI) — the most stable of the four and
20
+ the only one that emits `total_cost_usd` directly, making it the reference
21
+ implementation for the parser and cost path. `codex` / `gemini` / `grok` are
22
+ declared in the config schema for forward compatibility but rejected with a
23
+ clear error until their phase lands (Phase 1b-1d).
24
+
25
+ ### Added
26
+
27
+ - **`kind: "agent_cli"` + `AgentCliAdapter`** (`coderouter/adapters/agent_cli.py`,
28
+ new) — invokes the Claude Code CLI one-shot via
29
+ `claude -p --output-format json` (prompt fed on stdin, never on argv, so
30
+ it is never subject to shell interpretation; `shell=True` is never used).
31
+ Key behaviors:
32
+ - Subscription-first OAuth: the child process does NOT inherit the parent
33
+ environment. A minimal env is built explicitly (fixed safe `PATH`,
34
+ `NO_COLOR=1`, `TERM=dumb`, inherited `HOME` for credential-dir
35
+ discovery); `ANTHROPIC_API_KEY` is never forwarded unless the operator
36
+ explicitly lists it in `passthrough_env` (prevents a stray key from
37
+ silently overriding subscription auth). `--bare` is deliberately never
38
+ added — it would skip OAuth/keychain reads.
39
+ - `CODEROUTER_AGENT_DEPTH` recursion guard: the depth is read from the
40
+ environment, incremented, and propagated into the child; `generate()`
41
+ refuses with a non-retryable error once the current depth reaches
42
+ `agent_depth_limit` (default 2).
43
+ - `exec_timeout_s` is enforced independently of `ProviderConfig.timeout_s`
44
+ via `asyncio.wait_for`; on expiry the whole child process *group* is
45
+ `SIGKILL`ed (`start_new_session=True` + `os.killpg`) so the CLI's real
46
+ LLM-call subprocess is never orphaned.
47
+ - Default `read_only` sandbox: `allow_file_writes=False` /
48
+ `sandbox_mode="read_only"` map to claude's `--permission-mode plan`.
49
+ The permission-mode mapping is clamped to read-only whenever
50
+ `allow_file_writes` is False, regardless of `sandbox_mode` (defense in
51
+ depth). `edit` / `full_auto` both map to `acceptEdits`.
52
+ - Pseudo-streaming: no CLI in Phase 1a exposes a stable token stream, so
53
+ `stream()` runs `generate()` once and chunks the final answer into
54
+ content `StreamChunk`s followed by a terminal `finish_reason="stop"`
55
+ chunk carrying usage.
56
+ - `total_cost_usd` (claude's JSON output) propagates to the response as
57
+ the `coderouter_cost_usd` metadata field, feeding the cost dashboard;
58
+ `session_id` similarly surfaces as `coderouter_session_id`.
59
+ - **`AgentCliConfig` schema** (`coderouter/config/schemas.py`) — new
60
+ `ProviderConfig.agent_cli` sub-config (`agent`, `command`, `workdir`,
61
+ `exec_timeout_s`, `allow_file_writes`, `sandbox_mode`, `model`,
62
+ `max_turns`, `passthrough_env`, `agent_depth_limit`), `extra="forbid"`
63
+ like the rest of the module. `ProviderConfig.base_url` is relaxed to
64
+ optional so `agent_cli` providers (which shell out to a local CLI rather
65
+ than calling a URL) can omit it; a `model_validator` restores the
66
+ required-ness of `base_url` for `openai_compat` / `anthropic` and
67
+ requires the `agent_cli` sub-config whenever `kind == "agent_cli"`.
68
+ - **30 new tests** (`tests/test_agent_cli.py`) covering argv construction
69
+ (model/max-turns/permission-mode mapping and the write-clamp), claude JSON
70
+ parsing (success / `is_error` / malformed / missing-field paths), a
71
+ stubbed-subprocess `generate()` path, timeout → process-group kill,
72
+ child-env isolation (no `ANTHROPIC_API_KEY` leak, `passthrough_env`
73
+ allowlist, depth increment), the recursion depth limit, and a TestClient
74
+ end-to-end run through `POST /v1/chat/completions`.
75
+ - New example config: `examples/providers-agent-cli.yaml` — a runnable
76
+ single-provider `agent_cli` setup for `claude`, plus a commented-out
77
+ preview of the future `codex` / `gemini` / `grok` provider blocks.
78
+ - Design doc: `docs/designs/external-agents-adapter.md` — the full Phase 1
79
+ design (architecture, security requirements, per-CLI argv/JSON tables,
80
+ auth policy, test plan). `codex` / `gemini` / `grok` remain Phase
81
+ 1b-1d — configuring `agent_cli.agent` to any of them is accepted at
82
+ config-load time but rejected with a clear, non-retryable error
83
+ (`"agent 'codex' is not implemented in Phase 1a (claude only)"`) when the
84
+ adapter is constructed.
85
+
86
+ ---
87
+
88
+ ### Fixed
89
+
90
+ - **Paid gate blocked the example config** (PR #63): the `ALLOW_PAID` env var
91
+ overrides the yaml `allow_paid`, so the example's `allow_paid: true` was
92
+ silently defeated. Subscription-OAuth claude has zero incremental cost —
93
+ the example now marks the provider `paid: false` (grok stays `paid: true`,
94
+ API-metered).
95
+ - **`Not logged in` under the minimal child env** (PR #63): on macOS the
96
+ Claude Code CLI resolves its Keychain credential via `USER`; the child env
97
+ now inherits `USER`/`LOGNAME` alongside `HOME`. Failures reported as an
98
+ `is_error` result JSON on stdout (exit 1, empty stderr) now surface the
99
+ actual `result` text in provider-failed logs instead of an empty tail.
100
+
12
101
  ## [v2.7.6] — 2026-07-09 (Launcher MTP / speculative-decoding support)
13
102
 
14
103
  **PR #59 / #60**. Adds Multi-Token Prediction (MTP) / speculative-decoding
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coderouter-cli
3
- Version: 2.7.6
3
+ Version: 2.7.7
4
4
  Summary: Local-first, free-first, fallback-built-in LLM router. Claude Code / OpenAI compatible.
5
5
  Project-URL: Homepage, https://github.com/zephel01/CodeRouter
6
6
  Project-URL: Repository, https://github.com/zephel01/CodeRouter