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