coderouter-cli 2.7.7__tar.gz → 2.7.9__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 (265) hide show
  1. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/CHANGELOG.md +182 -0
  2. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/PKG-INFO +1 -1
  3. coderouter_cli-2.7.9/coderouter/adapters/agent_cli.py +977 -0
  4. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/config/schemas.py +53 -8
  5. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/backend_health.py +63 -1
  6. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/logging.py +60 -0
  7. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/fallback.py +37 -0
  8. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/README.en.md +1 -0
  9. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/README.md +1 -0
  10. coderouter_cli-2.7.9/docs/backends/external-agents.en.md +333 -0
  11. coderouter_cli-2.7.9/docs/backends/external-agents.md +333 -0
  12. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/designs/external-agents-adapter.md +39 -3
  13. coderouter_cli-2.7.9/examples/providers-agent-cli.yaml +225 -0
  14. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/pyproject.toml +1 -1
  15. coderouter_cli-2.7.9/tests/test_agent_cli.py +1238 -0
  16. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_backend_health.py +182 -0
  17. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mE_config_validation.py +41 -0
  18. coderouter_cli-2.7.7/coderouter/adapters/agent_cli.py +0 -591
  19. coderouter_cli-2.7.7/examples/providers-agent-cli.yaml +0 -166
  20. coderouter_cli-2.7.7/tests/test_agent_cli.py +0 -529
  21. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/.gitignore +0 -0
  22. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/LICENSE +0 -0
  23. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/README.en.md +0 -0
  24. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/README.md +0 -0
  25. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/__init__.py +0 -0
  26. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/__main__.py +0 -0
  27. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/adapters/__init__.py +0 -0
  28. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/adapters/anthropic_native.py +0 -0
  29. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/adapters/base.py +0 -0
  30. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/adapters/openai_compat.py +0 -0
  31. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/adapters/registry.py +0 -0
  32. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/cli.py +0 -0
  33. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/cli_stats.py +0 -0
  34. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/config/__init__.py +0 -0
  35. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/config/capability_registry.py +0 -0
  36. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/config/env_file.py +0 -0
  37. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/config/loader.py +0 -0
  38. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/cost.py +0 -0
  39. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/data/__init__.py +0 -0
  40. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/data/model-capabilities.yaml +0 -0
  41. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/doctor.py +0 -0
  42. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/doctor_apply.py +0 -0
  43. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/env_security.py +0 -0
  44. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/errors.py +0 -0
  45. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/gguf_introspect.py +0 -0
  46. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/__init__.py +0 -0
  47. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/_fingerprint.py +0 -0
  48. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/context_budget.py +0 -0
  49. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/continuous_probe.py +0 -0
  50. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/drift_actions.py +0 -0
  51. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/drift_detection.py +0 -0
  52. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/memory_budget.py +0 -0
  53. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/memory_pressure.py +0 -0
  54. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/self_healing.py +0 -0
  55. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/guards/tool_loop.py +0 -0
  56. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/hardware.py +0 -0
  57. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/__init__.py +0 -0
  58. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/anthropic_routes.py +0 -0
  59. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/app.py +0 -0
  60. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/dashboard_routes.py +0 -0
  61. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/launcher_routes.py +0 -0
  62. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/metrics_routes.py +0 -0
  63. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/ingress/openai_routes.py +0 -0
  64. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/language_tax.py +0 -0
  65. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/launcher_speculative.py +0 -0
  66. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/metrics/__init__.py +0 -0
  67. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/metrics/collector.py +0 -0
  68. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/metrics/prometheus.py +0 -0
  69. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/output_filters.py +0 -0
  70. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/plugins/__init__.py +0 -0
  71. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/plugins/base.py +0 -0
  72. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/plugins/loader.py +0 -0
  73. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/plugins/registry.py +0 -0
  74. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/__init__.py +0 -0
  75. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/adaptive.py +0 -0
  76. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/auto_router.py +0 -0
  77. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/budget.py +0 -0
  78. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/routing/capability.py +0 -0
  79. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/__init__.py +0 -0
  80. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/audit_log.py +0 -0
  81. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/replay.py +0 -0
  82. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/request_log.py +0 -0
  83. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/store.py +0 -0
  84. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/state/suggest_rules.py +0 -0
  85. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/token_estimation.py +0 -0
  86. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/token_estimation_accurate.py +0 -0
  87. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/translation/__init__.py +0 -0
  88. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/translation/anthropic.py +0 -0
  89. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/translation/convert.py +0 -0
  90. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/coderouter/translation/tool_repair.py +0 -0
  91. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/assets/dashboard-demo.png +0 -0
  92. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
  93. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
  94. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/gguf_dl.en.md +0 -0
  95. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/gguf_dl.md +0 -0
  96. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/hf-ollama-models.en.md +0 -0
  97. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/hf-ollama-models.md +0 -0
  98. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/install-backends.en.md +0 -0
  99. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/install-backends.md +0 -0
  100. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/launcher-quickstart.en.md +0 -0
  101. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/launcher-quickstart.md +0 -0
  102. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/launcher.en.md +0 -0
  103. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/launcher.md +0 -0
  104. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/llamacpp-direct.en.md +0 -0
  105. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/llamacpp-direct.md +0 -0
  106. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/lmstudio-direct.en.md +0 -0
  107. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/lmstudio-direct.md +0 -0
  108. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/backends/verify-ollama-0.23.1.md +0 -0
  109. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/architecture.en.md +0 -0
  110. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/architecture.md +0 -0
  111. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/context-budget.en.md +0 -0
  112. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/context-budget.md +0 -0
  113. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/continuous-probing.en.md +0 -0
  114. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/continuous-probing.md +0 -0
  115. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/drift-detection.en.md +0 -0
  116. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/drift-detection.md +0 -0
  117. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/partial-stitch.en.md +0 -0
  118. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/concepts/partial-stitch.md +0 -0
  119. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/designs/v1.5-dashboard-mockup.html +0 -0
  120. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/designs/v1.6-auto-router-verification.md +0 -0
  121. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/designs/v1.6-auto-router.md +0 -0
  122. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/free-tier-guide.en.md +0 -0
  123. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/free-tier-guide.md +0 -0
  124. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/language-tax.en.md +0 -0
  125. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/language-tax.md +0 -0
  126. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/remote-access.en.md +0 -0
  127. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/remote-access.md +0 -0
  128. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/security.en.md +0 -0
  129. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/security.md +0 -0
  130. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/troubleshooting.en.md +0 -0
  131. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/troubleshooting.md +0 -0
  132. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/usage-guide.en.md +0 -0
  133. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/guides/usage-guide.md +0 -0
  134. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/low-memory-integration.en.md +0 -0
  135. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/low-memory-integration.md +0 -0
  136. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/openrouter-roster/CHANGES.md +0 -0
  137. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/openrouter-roster/README.md +0 -0
  138. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/openrouter-roster/latest.json +0 -0
  139. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v0.4.md +0 -0
  140. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v0.5-verify.md +0 -0
  141. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v0.5.md +0 -0
  142. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v0.6.md +0 -0
  143. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v0.7.md +0 -0
  144. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v1.0-verify.md +0 -0
  145. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/retrospectives/v1.0.md +0 -0
  146. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/start/quickstart.en.md +0 -0
  147. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/start/quickstart.md +0 -0
  148. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/start/when-do-i-need-coderouter.en.md +0 -0
  149. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/docs/start/when-do-i-need-coderouter.md +0 -0
  150. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/.env.example +0 -0
  151. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/README.md +0 -0
  152. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers-multiagent.yaml +0 -0
  153. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.context-budget-test.yaml +0 -0
  154. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.llamacpp-vllm.yaml +0 -0
  155. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.nvidia-nim.yaml +0 -0
  156. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.ollama-auto-custom.yaml +0 -0
  157. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.ollama-auto.yaml +0 -0
  158. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.ollama-free-chain.yaml +0 -0
  159. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.raspberrypi.yaml +0 -0
  160. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/examples/providers.yaml +0 -0
  161. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/demo_traffic.sh +0 -0
  162. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/openrouter_roster_diff.py +0 -0
  163. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/smoke_v2_2.sh +0 -0
  164. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/verify-providers.yaml +0 -0
  165. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/verify_ollama_0_23.py +0 -0
  166. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/verify_v0_5.sh +0 -0
  167. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/scripts/verify_v1_0.sh +0 -0
  168. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/__init__.py +0 -0
  169. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/conftest.py +0 -0
  170. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_adapter_anthropic.py +0 -0
  171. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_audit_log.py +0 -0
  172. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_auto_router.py +0 -0
  173. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_auto_router_cjk.py +0 -0
  174. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_budget.py +0 -0
  175. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_capability.py +0 -0
  176. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_capability_degraded_payload.py +0 -0
  177. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_capability_registry.py +0 -0
  178. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_capability_registry_cache_control.py +0 -0
  179. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_capability_tool_choice.py +0 -0
  180. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_claude_code_suitability.py +0 -0
  181. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_cli.py +0 -0
  182. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_cli_bind_warning.py +0 -0
  183. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_cli_stats.py +0 -0
  184. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_config.py +0 -0
  185. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_config_shim_actions.py +0 -0
  186. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_context_budget.py +0 -0
  187. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_continuous_probe.py +0 -0
  188. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_dashboard_endpoint.py +0 -0
  189. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_doctor.py +0 -0
  190. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_doctor_apply.py +0 -0
  191. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_doctor_cache_probe.py +0 -0
  192. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_drift_actions.py +0 -0
  193. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_drift_detection.py +0 -0
  194. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_drift_detection_integration.py +0 -0
  195. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_env_file.py +0 -0
  196. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_env_security.py +0 -0
  197. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_errors.py +0 -0
  198. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_examples_yaml.py +0 -0
  199. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback.py +0 -0
  200. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_anthropic.py +0 -0
  201. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_cache_control.py +0 -0
  202. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_cache_observed.py +0 -0
  203. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_cache_strip.py +0 -0
  204. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_empty_response.py +0 -0
  205. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_misconfig_warn.py +0 -0
  206. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_paid_gate.py +0 -0
  207. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_thinking.py +0 -0
  208. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fallback_tool_choice_emulate.py +0 -0
  209. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h1_prometheus_drift.py +0 -0
  210. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h2_h6_translation.py +0 -0
  211. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h3_client_reuse.py +0 -0
  212. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h4_h5_guards.py +0 -0
  213. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h7_probe_restore.py +0 -0
  214. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_h8_launcher_auth.py +0 -0
  215. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mA_routing.py +0 -0
  216. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mB_adapters.py +0 -0
  217. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mC_convert.py +0 -0
  218. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mD_logging_metrics.py +0 -0
  219. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_fix_mF_ingress.py +0 -0
  220. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_gguf_introspect.py +0 -0
  221. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_guards_tool_loop.py +0 -0
  222. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_hardware.py +0 -0
  223. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_ingress_anthropic.py +0 -0
  224. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_ingress_count_tokens.py +0 -0
  225. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_ingress_profile.py +0 -0
  226. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_language_tax.py +0 -0
  227. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_language_tax_integration.py +0 -0
  228. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_launcher_mtp.py +0 -0
  229. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_launcher_mtp_fallback.py +0 -0
  230. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_launcher_provider_sync.py +0 -0
  231. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_memory_budget.py +0 -0
  232. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_memory_pressure.py +0 -0
  233. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_cache.py +0 -0
  234. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_collector.py +0 -0
  235. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_cost.py +0 -0
  236. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_endpoint.py +0 -0
  237. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_jsonl.py +0 -0
  238. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_prometheus.py +0 -0
  239. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_metrics_prometheus_cache.py +0 -0
  240. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_models_passthrough.py +0 -0
  241. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_openai_compat.py +0 -0
  242. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_openrouter_roster_diff.py +0 -0
  243. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_output_filters.py +0 -0
  244. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_output_filters_adapters.py +0 -0
  245. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_partial_stitch.py +0 -0
  246. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_plugins_integration.py +0 -0
  247. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_plugins_loader.py +0 -0
  248. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_plugins_registry.py +0 -0
  249. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_reasoning_strip.py +0 -0
  250. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_repair_byte_fallback.py +0 -0
  251. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_request_log.py +0 -0
  252. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_role_normalization.py +0 -0
  253. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_routing_adaptive.py +0 -0
  254. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_self_healing.py +0 -0
  255. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_setup_sh.py +0 -0
  256. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_state_store.py +0 -0
  257. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_token_estimation.py +0 -0
  258. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_token_estimation_accurate.py +0 -0
  259. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_tokens_saved_metric.py +0 -0
  260. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_tool_repair.py +0 -0
  261. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_tool_repair_lenient.py +0 -0
  262. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_tool_repair_r4.py +0 -0
  263. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_toolrepair_bench.py +0 -0
  264. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_translation_anthropic.py +0 -0
  265. {coderouter_cli-2.7.7 → coderouter_cli-2.7.9}/tests/test_translation_reverse.py +0 -0
@@ -9,6 +9,188 @@ are kept verbatim where the Japanese text itself is the subject).
9
9
 
10
10
  ---
11
11
 
12
+ ## [v2.7.9] — 2026-07-11 (agent_cli Phase 1b: codex)
13
+
14
+ Adds the third target to the `agent_cli` adapter: `agent: codex` (the OpenAI
15
+ Codex CLI) is now implemented alongside `claude` (Phase 1a) and `grok`
16
+ (Phase 1d). The implementation was verified against the real CLI (codex-cli
17
+ 0.144.1, 2026-07-11), and one design-time assumption from the 2026-07
18
+ research did not survive contact with it: `codex exec` has no approval flag
19
+ at all (`-a`/`--ask-for-approval` doesn't exist in `exec --help` on
20
+ 0.144.1, since non-interactive execution has no approval prompt to control
21
+ in the first place), so the design's separate `edit`/`full_auto` mappings
22
+ (`-a on-request` / `-a never`) collapse into a single `-s workspace-write`
23
+ mapping — unlike claude/grok, codex does not distinguish `edit` from
24
+ `full_auto`. The verified JSONL `turn.completed.usage` payload also carries
25
+ a field the design didn't record, `reasoning_output_tokens`, which is now
26
+ normalized defensively into `completion_tokens_details.reasoning_tokens`.
27
+ Everything else (stdin prompt delivery, `--skip-git-repo-check`,
28
+ `--ephemeral`, the absence of `--max-turns`/`--timeout`, the ~8-day OAuth
29
+ staleness) matched the design closely. `gemini` remains schema-declared but
30
+ rejected (Phase 1c pending).
31
+
32
+ ### Added
33
+
34
+ - **`agent: codex` builder/parser in `AgentCliAdapter`**
35
+ (`coderouter/adapters/agent_cli.py`) — invokes the Codex CLI one-shot as
36
+ `codex exec --json --skip-git-repo-check --ephemeral -m <model>
37
+ -C <workdir> -s read-only -` (read_only default). The prompt is delivered
38
+ on stdin with an explicit trailing `-` sentinel — the same channel as
39
+ claude, unlike grok's `--prompt-file` delivery. Output is JSONL on
40
+ stdout (progress goes to stderr); the final answer is the `item.text` of
41
+ the **last** `item.completed` event whose `item.type=="agent_message"`.
42
+ Usage comes from `turn.completed.usage` and is normalized as
43
+ `prompt_tokens=input_tokens` / `completion_tokens=output_tokens`, with
44
+ `cached_input_tokens` kept as `prompt_tokens_details.cached_tokens` (a
45
+ subset of `input_tokens`, not added on top — verified 13810 ⊃ 9984) and
46
+ `reasoning_output_tokens` kept as
47
+ `completion_tokens_details.reasoning_tokens` when nonzero; multiple
48
+ `turn.completed` events, if seen, are summed. `thread_id` (from
49
+ `thread.started`) surfaces as `coderouter_session_id`. Parsing is
50
+ defensive line-by-line — a non-JSON line doesn't abort the rest of the
51
+ stream, but no valid `agent_message` (or empty stdout) raises a
52
+ retryable `AdapterError`, as does any `error` event or `turn.failed`.
53
+ The CLI is pre-1.0 and `--json`'s alias is still `--experimental-json`
54
+ (schema not frozen), so version pinning is recommended alongside the
55
+ defensive parsing.
56
+ - **`sandbox_mode` → codex flag mapping** — `read_only` → `-s read-only`;
57
+ `edit` → `-s workspace-write`; `full_auto` → `-s workspace-write` (same
58
+ as `edit` — `exec` has no approval flag in 0.144.1, and
59
+ `--dangerously-bypass-approvals-and-sandbox` is never used). As with
60
+ claude/grok, the effective mode is clamped to read-only whenever
61
+ `allow_file_writes=false`, regardless of `sandbox_mode`.
62
+ - **`--skip-git-repo-check` always passed** — CodeRouter's isolated workdir
63
+ is never a git repository, and codex's default "trusted directory" check
64
+ fails immediately outside one (exit 1, stderr `Not inside a trusted
65
+ directory and --skip-git-repo-check was not specified.` — field-verified).
66
+ The adapter always passes this flag, so that error should never surface
67
+ in normal operation.
68
+ - **`--ephemeral` always passed** — prevents the session from persisting to
69
+ disk, for the same stateless-transformation rationale as grok's
70
+ `--no-memory`. Not configurable.
71
+ - **`max_turns` ignored for codex** — `codex exec` has neither
72
+ `--max-turns` nor `--timeout`; `AgentCliConfig.max_turns` has no effect
73
+ when `agent: codex`, and `exec_timeout_s` + process-group `SIGKILL` is
74
+ the only time bound.
75
+ - **`coderouter_session_id` via `thread_id`** — same response-metadata
76
+ treatment as claude's `session_id` and grok's `sessionId`.
77
+
78
+ ### Changed
79
+
80
+ - **Unsupported-agent error message** — constructing the adapter with a
81
+ not-yet-implemented agent now lists all three implemented agents (e.g.
82
+ `agent 'gemini' is not implemented yet (implemented: claude, codex,
83
+ grok)`) instead of the two-agent wording from v2.7.8.
84
+ - **Schema docstrings** (`coderouter/config/schemas.py`) — `AgentCliConfig`
85
+ field descriptions updated for the three-agent reality, including the
86
+ `max_turns` docstring noting codex ignores it.
87
+ - **Docs & examples** — `docs/backends/external-agents.md`/`.en.md` gain a
88
+ full codex section (config example, adapter argv, stdin-vs-`--prompt-file`
89
+ contrast with grok, sandbox mapping table with the no-approval-flag-in-exec
90
+ note, JSONL schema and usage normalization including
91
+ `reasoning_output_tokens`, OAuth setup with the ~8-day staleness caveat
92
+ and `CODEX_API_KEY`/`OPENAI_API_KEY`/`CODEX_HOME`, and the pre-1.0
93
+ version-pin caveat) and updated implementation-status wording (claude +
94
+ codex + grok implemented; gemini-only rejected). The design doc
95
+ `docs/designs/external-agents-adapter.md` gets a new appendix §11.4
96
+ recording the verified deltas between the 2026-07 research and
97
+ codex-cli 0.144.1 (body text left as the historical record); its header
98
+ status line now lists Phase 1b alongside 1a/1d.
99
+ `examples/providers-agent-cli.yaml` promotes codex out of the
100
+ not-implemented preview into a documented (still commented-out, so
101
+ copying the file doesn't require codex to be installed) block with
102
+ `model: gpt-5.5`, `paid: false` for subscription OAuth, and
103
+ `passthrough_env: []`; the preview section at the bottom is retitled to
104
+ Phase 1c (gemini only), with codex removed from it.
105
+
106
+ ## [v2.7.8] — 2026-07-10 (agent_cli Phase 1d: grok)
107
+
108
+ **PR #68**. Adds the second target to the `agent_cli` adapter: `agent: grok` (the xAI
109
+ Grok CLI) is now implemented alongside `claude` from Phase 1a. The
110
+ implementation was verified against the real CLI (grok v0.2.93, [stable]
111
+ channel, 2026-07-10), and several design-time assumptions from the 2026-07
112
+ research did not survive contact with it: the CLI now supports OAuth
113
+ subscription login (the design assumed grok was API-key-only with no
114
+ subscription path), `--sandbox` takes a profile value
115
+ (`off|workspace|read-only|strict`) rather than being a bare flag, a
116
+ Claude-Code-compatible `--permission-mode` exists, and `-p`/`--single` only
117
+ accepts the prompt as an argv value (stdin is not accepted as the prompt) —
118
+ so the adapter delivers the prompt via a temp file instead. The grok CLI is
119
+ still early beta: version pinning is recommended, and the JSON output is
120
+ parsed defensively so schema churn degrades into retryable fallback rather
121
+ than hard failure. `codex` / `gemini` remain schema-declared but rejected
122
+ (Phase 1b/1c pending).
123
+
124
+ ### Added
125
+
126
+ - **`agent: grok` builder/parser in `AgentCliAdapter`**
127
+ (`coderouter/adapters/agent_cli.py`) — invokes the Grok CLI one-shot as
128
+ `grok --prompt-file <workdir>/.coderouter-prompt-<uuid>.txt
129
+ --output-format json -m <model> --cwd <workdir> --max-turns <N>
130
+ --no-memory --sandbox read-only --permission-mode plan` (read_only
131
+ default). Auth is subscription-first, same as claude: the CLI's OAuth
132
+ login (`grok login`, SuperGrok / X Premium+) stores credentials at
133
+ `~/.grok/auth.json` (7-day expiry, auto-refresh; `GROK_HOME` overrides),
134
+ which the adapter's `HOME` inheritance reaches with
135
+ `passthrough_env: []`. For CI/API-key use the CLI reads
136
+ `GROK_CODE_XAI_API_KEY` (not `XAI_API_KEY`) — list it in
137
+ `passthrough_env` only if needed; it takes precedence over OAuth.
138
+ - **`sandbox_mode` → grok flag mapping** — `read_only` →
139
+ `--sandbox read-only --permission-mode plan`; `edit` →
140
+ `--sandbox workspace --permission-mode acceptEdits`; `full_auto` →
141
+ `--sandbox workspace --always-approve`. As with claude, the effective
142
+ mode is clamped to read-only whenever `allow_file_writes=false`,
143
+ regardless of `sandbox_mode` (defense in depth). Unlike claude,
144
+ `full_auto` maps distinctly from `edit`.
145
+ - **Prompt delivery via `--prompt-file`** — grok's `-p`/`--single` requires
146
+ the prompt as an argv VALUE (verified on the real CLI: stdin is not
147
+ accepted as the prompt), and putting huge prompts on argv would hit
148
+ Linux's `MAX_ARG_STRLEN` (~128KiB) and expose the full prompt text to
149
+ `ps`. The adapter instead writes the prompt to a mode-`0600` temp file
150
+ inside the isolated workdir and passes `--prompt-file`; the file is
151
+ always deleted afterwards, including on the timeout and error paths.
152
+ - **`--no-memory` always passed** — grok has a cross-session memory
153
+ feature; disabling it unconditionally preserves the
154
+ "one request = one stateless transformation" ethos (a previous call's
155
+ memory can never leak into the next response). Not configurable.
156
+ - **grok JSON parsing + zero-usage reporting** — `--output-format json`
157
+ emits a single JSON object `{"text", "stopReason", "sessionId",
158
+ "requestId", "thought"?}` (verified on grok v0.2.93). `text` becomes the
159
+ final answer; `sessionId` surfaces as the `coderouter_session_id`
160
+ response metadata. There are NO token-usage or cost fields, so usage is
161
+ reported as zeros and `coderouter_cost_usd` stays 0 unless the operator
162
+ sets unit prices in `ProviderConfig.cost` (in contrast to claude's
163
+ direct `total_cost_usd`). Parsing is defensive: anything malformed
164
+ raises a retryable `AdapterError` and the fallback chain advances.
165
+ Runtime errors (exit 1 with the error text on stderr) surface a stderr
166
+ tail in the `AdapterError` message.
167
+
168
+ ### Changed
169
+
170
+ - **Unsupported-agent error message** — constructing the adapter with a
171
+ not-yet-implemented agent now lists what IS implemented (e.g.
172
+ `agent 'codex' is not implemented yet (implemented: claude, grok)`)
173
+ instead of the Phase-1a-specific "claude only" wording. Still
174
+ `retryable=False` — a configuration error, not a fallback candidate.
175
+ - **Schema docstrings** (`coderouter/config/schemas.py`) — `AgentCliConfig`
176
+ field descriptions updated for the two-agent reality; the design-time
177
+ "grok requires `XAI_API_KEY` in `passthrough_env`" validation note was
178
+ dropped as obsolete (grok now supports subscription OAuth).
179
+ - **Docs & examples** — `docs/backends/external-agents.md`/`.en.md` gain a
180
+ full grok section (config example, adapter argv, sandbox mapping table,
181
+ prompt-file rationale, `--no-memory` rationale, JSON schema and
182
+ zero-usage note, OAuth setup steps, early-beta/version-pin caveat) and
183
+ updated implementation-status wording. The design doc
184
+ `docs/designs/external-agents-adapter.md` gets a new appendix §11.3
185
+ recording the verified deltas between the 2026-07 research and grok
186
+ v0.2.93 (body text left as the historical record).
187
+ `examples/providers-agent-cli.yaml` promotes grok out of the
188
+ not-implemented preview into a documented (still commented-out, so
189
+ copying the file doesn't require grok to be installed) block with the
190
+ corrected model (`grok-4.5` — `grok-code-fast-1` was retired
191
+ 2026-05-15), `paid: false` for subscription OAuth, and
192
+ `passthrough_env: []`.
193
+
12
194
  ## [v2.7.7] — 2026-07-10 (External coding agents: agent_cli adapter, Phase 1a claude)
13
195
 
14
196
  **PR #62 / #63**. Adds a new adapter kind, `agent_cli`, that lets CodeRouter front an external
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coderouter-cli
3
- Version: 2.7.7
3
+ Version: 2.7.9
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