coderouter-cli 2.8.1__tar.gz → 2.9.1__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 (273) hide show
  1. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/CHANGELOG.md +168 -1
  2. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/PKG-INFO +5 -3
  3. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/README.en.md +4 -2
  4. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/README.md +4 -2
  5. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/adapters/registry.py +31 -48
  6. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/config/schemas.py +555 -8
  7. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/doctor.py +58 -0
  8. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/app.py +29 -0
  9. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/launcher_routes.py +476 -147
  10. coderouter_cli-2.9.1/coderouter/launcher_swap.py +466 -0
  11. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/fallback.py +225 -5
  12. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/README.en.md +8 -3
  13. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/README.md +10 -4
  14. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/external-agents.en.md +32 -4
  15. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/external-agents.md +32 -4
  16. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/agent-cli-plugin-extraction.md +5 -1
  17. coderouter_cli-2.9.1/docs/designs/launcher-model-swap.md +556 -0
  18. coderouter_cli-2.9.1/docs/guides/subagent-routing.en.md +387 -0
  19. coderouter_cli-2.9.1/docs/guides/subagent-routing.md +387 -0
  20. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/README.md +2 -0
  21. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers-agent-cli.yaml +35 -6
  22. coderouter_cli-2.9.1/examples/providers.swap.yaml +121 -0
  23. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/pyproject.toml +1 -1
  24. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_agent_cli.py +9 -6
  25. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_doctor.py +95 -0
  26. coderouter_cli-2.9.1/tests/test_launcher_readiness_restart.py +701 -0
  27. coderouter_cli-2.9.1/tests/test_launcher_swap.py +782 -0
  28. coderouter_cli-2.9.1/tests/test_launcher_swap_review.py +488 -0
  29. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_plugin_adapter.py +40 -49
  30. coderouter_cli-2.8.1/coderouter/adapters/agent_cli.py +0 -1168
  31. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/.gitignore +0 -0
  32. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/LICENSE +0 -0
  33. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/__init__.py +0 -0
  34. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/__main__.py +0 -0
  35. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/adapters/__init__.py +0 -0
  36. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/adapters/anthropic_native.py +0 -0
  37. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/adapters/base.py +0 -0
  38. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/adapters/openai_compat.py +0 -0
  39. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/cli.py +0 -0
  40. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/cli_stats.py +0 -0
  41. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/config/__init__.py +0 -0
  42. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/config/capability_registry.py +0 -0
  43. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/config/env_file.py +0 -0
  44. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/config/loader.py +0 -0
  45. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/cost.py +0 -0
  46. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/data/__init__.py +0 -0
  47. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/data/model-capabilities.yaml +0 -0
  48. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/doctor_apply.py +0 -0
  49. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/env_security.py +0 -0
  50. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/errors.py +0 -0
  51. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/gguf_introspect.py +0 -0
  52. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/__init__.py +0 -0
  53. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/_fingerprint.py +0 -0
  54. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/backend_health.py +0 -0
  55. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/context_budget.py +0 -0
  56. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/continuous_probe.py +0 -0
  57. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/drift_actions.py +0 -0
  58. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/drift_detection.py +0 -0
  59. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/memory_budget.py +0 -0
  60. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/memory_pressure.py +0 -0
  61. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/self_healing.py +0 -0
  62. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/tool_loop.py +0 -0
  63. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/hardware.py +0 -0
  64. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/__init__.py +0 -0
  65. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/anthropic_routes.py +0 -0
  66. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/dashboard_routes.py +0 -0
  67. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/metrics_routes.py +0 -0
  68. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/openai_routes.py +0 -0
  69. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/language_tax.py +0 -0
  70. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/launcher_speculative.py +0 -0
  71. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/logging.py +0 -0
  72. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/metrics/__init__.py +0 -0
  73. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/metrics/collector.py +0 -0
  74. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/metrics/prometheus.py +0 -0
  75. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/output_filters.py +0 -0
  76. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/plugins/__init__.py +0 -0
  77. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/plugins/base.py +0 -0
  78. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/plugins/loader.py +0 -0
  79. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/plugins/registry.py +0 -0
  80. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/__init__.py +0 -0
  81. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/adaptive.py +0 -0
  82. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/auto_router.py +0 -0
  83. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/budget.py +0 -0
  84. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/capability.py +0 -0
  85. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/__init__.py +0 -0
  86. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/audit_log.py +0 -0
  87. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/replay.py +0 -0
  88. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/request_log.py +0 -0
  89. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/store.py +0 -0
  90. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/suggest_rules.py +0 -0
  91. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/token_estimation.py +0 -0
  92. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/token_estimation_accurate.py +0 -0
  93. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/translation/__init__.py +0 -0
  94. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/translation/anthropic.py +0 -0
  95. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/translation/convert.py +0 -0
  96. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/translation/tool_repair.py +0 -0
  97. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/assets/dashboard-demo.png +0 -0
  98. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
  99. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
  100. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/gguf_dl.en.md +0 -0
  101. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/gguf_dl.md +0 -0
  102. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/hf-ollama-models.en.md +0 -0
  103. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/hf-ollama-models.md +0 -0
  104. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/install-backends.en.md +0 -0
  105. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/install-backends.md +0 -0
  106. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/launcher-quickstart.en.md +0 -0
  107. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/launcher-quickstart.md +0 -0
  108. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/launcher.en.md +0 -0
  109. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/launcher.md +0 -0
  110. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/llamacpp-direct.en.md +0 -0
  111. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/llamacpp-direct.md +0 -0
  112. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/lmstudio-direct.en.md +0 -0
  113. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/lmstudio-direct.md +0 -0
  114. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/verify-ollama-0.23.1.md +0 -0
  115. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/architecture.en.md +0 -0
  116. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/architecture.md +0 -0
  117. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/context-budget.en.md +0 -0
  118. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/context-budget.md +0 -0
  119. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/continuous-probing.en.md +0 -0
  120. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/continuous-probing.md +0 -0
  121. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/drift-detection.en.md +0 -0
  122. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/drift-detection.md +0 -0
  123. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/partial-stitch.en.md +0 -0
  124. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/partial-stitch.md +0 -0
  125. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/external-agents-adapter.md +0 -0
  126. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/orchestration-companion.md +0 -0
  127. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/v1.5-dashboard-mockup.html +0 -0
  128. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/v1.6-auto-router-verification.md +0 -0
  129. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/v1.6-auto-router.md +0 -0
  130. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/free-tier-guide.en.md +0 -0
  131. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/free-tier-guide.md +0 -0
  132. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/language-tax.en.md +0 -0
  133. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/language-tax.md +0 -0
  134. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/remote-access.en.md +0 -0
  135. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/remote-access.md +0 -0
  136. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/security.en.md +0 -0
  137. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/security.md +0 -0
  138. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/troubleshooting.en.md +0 -0
  139. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/troubleshooting.md +0 -0
  140. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/usage-guide.en.md +0 -0
  141. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/usage-guide.md +0 -0
  142. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/low-memory-integration.en.md +0 -0
  143. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/low-memory-integration.md +0 -0
  144. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/openrouter-roster/CHANGES.md +0 -0
  145. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/openrouter-roster/README.md +0 -0
  146. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/openrouter-roster/latest.json +0 -0
  147. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v0.4.md +0 -0
  148. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v0.5-verify.md +0 -0
  149. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v0.5.md +0 -0
  150. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v0.6.md +0 -0
  151. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v0.7.md +0 -0
  152. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v1.0-verify.md +0 -0
  153. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v1.0.md +0 -0
  154. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/start/quickstart.en.md +0 -0
  155. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/start/quickstart.md +0 -0
  156. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/start/when-do-i-need-coderouter.en.md +0 -0
  157. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/start/when-do-i-need-coderouter.md +0 -0
  158. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/.env.example +0 -0
  159. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers-multiagent.yaml +0 -0
  160. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.context-budget-test.yaml +0 -0
  161. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.llamacpp-vllm.yaml +0 -0
  162. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.nvidia-nim.yaml +0 -0
  163. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.ollama-auto-custom.yaml +0 -0
  164. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.ollama-auto.yaml +0 -0
  165. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.ollama-free-chain.yaml +0 -0
  166. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.raspberrypi.yaml +0 -0
  167. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.yaml +0 -0
  168. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/demo_traffic.sh +0 -0
  169. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/openrouter_roster_diff.py +0 -0
  170. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/smoke_v2_2.sh +0 -0
  171. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/verify-providers.yaml +0 -0
  172. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/verify_ollama_0_23.py +0 -0
  173. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/verify_v0_5.sh +0 -0
  174. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/verify_v1_0.sh +0 -0
  175. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/__init__.py +0 -0
  176. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/conftest.py +0 -0
  177. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_adapter_anthropic.py +0 -0
  178. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_audit_log.py +0 -0
  179. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_auto_router.py +0 -0
  180. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_auto_router_cjk.py +0 -0
  181. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_backend_health.py +0 -0
  182. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_budget.py +0 -0
  183. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_capability.py +0 -0
  184. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_capability_degraded_payload.py +0 -0
  185. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_capability_registry.py +0 -0
  186. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_capability_registry_cache_control.py +0 -0
  187. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_capability_tool_choice.py +0 -0
  188. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_claude_code_suitability.py +0 -0
  189. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_cli.py +0 -0
  190. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_cli_bind_warning.py +0 -0
  191. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_cli_stats.py +0 -0
  192. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_config.py +0 -0
  193. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_config_shim_actions.py +0 -0
  194. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_context_budget.py +0 -0
  195. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_continuous_probe.py +0 -0
  196. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_dashboard_endpoint.py +0 -0
  197. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_doctor_apply.py +0 -0
  198. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_doctor_cache_probe.py +0 -0
  199. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_drift_actions.py +0 -0
  200. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_drift_detection.py +0 -0
  201. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_drift_detection_integration.py +0 -0
  202. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_env_file.py +0 -0
  203. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_env_security.py +0 -0
  204. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_errors.py +0 -0
  205. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_examples_yaml.py +0 -0
  206. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback.py +0 -0
  207. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_anthropic.py +0 -0
  208. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_cache_control.py +0 -0
  209. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_cache_observed.py +0 -0
  210. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_cache_strip.py +0 -0
  211. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_empty_response.py +0 -0
  212. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_misconfig_warn.py +0 -0
  213. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_paid_gate.py +0 -0
  214. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_thinking.py +0 -0
  215. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_tool_choice_emulate.py +0 -0
  216. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h1_prometheus_drift.py +0 -0
  217. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h2_h6_translation.py +0 -0
  218. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h3_client_reuse.py +0 -0
  219. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h4_h5_guards.py +0 -0
  220. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h7_probe_restore.py +0 -0
  221. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h8_launcher_auth.py +0 -0
  222. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mA_routing.py +0 -0
  223. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mB_adapters.py +0 -0
  224. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mC_convert.py +0 -0
  225. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mD_logging_metrics.py +0 -0
  226. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mE_config_validation.py +0 -0
  227. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mF_ingress.py +0 -0
  228. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_gguf_introspect.py +0 -0
  229. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_guards_tool_loop.py +0 -0
  230. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_hardware.py +0 -0
  231. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_ingress_anthropic.py +0 -0
  232. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_ingress_count_tokens.py +0 -0
  233. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_ingress_profile.py +0 -0
  234. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_language_tax.py +0 -0
  235. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_language_tax_integration.py +0 -0
  236. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_launcher_mtp.py +0 -0
  237. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_launcher_mtp_fallback.py +0 -0
  238. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_launcher_provider_sync.py +0 -0
  239. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_memory_budget.py +0 -0
  240. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_memory_pressure.py +0 -0
  241. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_cache.py +0 -0
  242. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_collector.py +0 -0
  243. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_cost.py +0 -0
  244. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_endpoint.py +0 -0
  245. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_jsonl.py +0 -0
  246. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_prometheus.py +0 -0
  247. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_prometheus_cache.py +0 -0
  248. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_models_passthrough.py +0 -0
  249. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_openai_compat.py +0 -0
  250. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_openrouter_roster_diff.py +0 -0
  251. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_output_filters.py +0 -0
  252. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_output_filters_adapters.py +0 -0
  253. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_partial_stitch.py +0 -0
  254. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_plugins_integration.py +0 -0
  255. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_plugins_loader.py +0 -0
  256. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_plugins_registry.py +0 -0
  257. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_reasoning_strip.py +0 -0
  258. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_repair_byte_fallback.py +0 -0
  259. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_request_log.py +0 -0
  260. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_role_normalization.py +0 -0
  261. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_routing_adaptive.py +0 -0
  262. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_self_healing.py +0 -0
  263. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_setup_sh.py +0 -0
  264. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_state_store.py +0 -0
  265. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_token_estimation.py +0 -0
  266. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_token_estimation_accurate.py +0 -0
  267. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_tokens_saved_metric.py +0 -0
  268. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_tool_repair.py +0 -0
  269. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_tool_repair_lenient.py +0 -0
  270. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_tool_repair_r4.py +0 -0
  271. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_toolrepair_bench.py +0 -0
  272. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_translation_anthropic.py +0 -0
  273. {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_translation_reverse.py +0 -0
@@ -9,9 +9,176 @@ are kept verbatim where the Japanese text itself is the subject).
9
9
 
10
10
  ---
11
11
 
12
+ ## [v2.9.1] — 2026-07-12 (launcher model swap Phase 1 — llama-swap-style on-demand models)
13
+
14
+ **New: `launcher.swap`** — an opt-in, dependency-free equivalent of
15
+ [llama-swap](https://github.com/mostlygeek/llama-swap)'s core loop, built on
16
+ the existing embedded Launcher. Declare a static model catalog and CodeRouter
17
+ will **spawn the backing `llama-server` on demand** when a request names the
18
+ model, **hold the request until the backend passes its readiness probe**, and
19
+ **auto-unload the process after an idle TTL** (`swap-unload`, memory returns
20
+ to zero). Only cataloged models can ever be spawned; `model_path` is resolved
21
+ against `launcher.model_dirs` both at config load (fail-fast) and again at
22
+ spawn (defense in depth). Design + as-built record:
23
+ `docs/designs/launcher-model-swap.md`. Sample: `examples/providers.swap.yaml`.
24
+ Verified end-to-end on macOS (M3 Max, Metal): cold spawn → warm reuse →
25
+ catalog-miss fallthrough → TTL unload → respawn, all green
26
+ (`_run/swap-test/` kit).
27
+
28
+ ### Added
29
+
30
+ - **`launcher.swap` config block** (`LauncherSwapConfig` / `SwapModelSpec`):
31
+ `enabled` (default `false` — zero impact until opted in), global
32
+ `ttl_seconds` (default 1800; `null` = never, `0` = unload at last release),
33
+ `readiness_timeout_s`, `sweep_interval_s`, `inject_auto_router_rules`, and
34
+ the static `models:` catalog (`name` / `backend` / `model_path` / fixed
35
+ `port` recommended / `num_ctx` / `extra_args` / speculative fields). Phase 2
36
+ fields (`group`, `est_weights_gb`, `memory_budget_gb`, `max_loaded`) are
37
+ schema-declared but not yet acted on.
38
+ - **`SwapManager`** (`coderouter/launcher_swap.py`): per-model
39
+ `asyncio.Lock` + lease accounting — concurrent requests for the same model
40
+ trigger exactly one spawn; streaming responses hold a lease for their whole
41
+ lifetime (a mid-stream process is never TTL-evicted); a failed spawn resets
42
+ to idle (no poisoning) and the next request retries.
43
+ - **Auto-generated routing**: with `default_profile: auto` and no explicit
44
+ `auto_router:` block, one exact-match rule per catalog model
45
+ (`id: swap:<name>`, `model_pattern = re.escape(name)`) is merged **ahead of
46
+ the bundled heuristics** (an explicitly named swap model beats
47
+ code-fence/image heuristics) while keeping the bundled rules and their
48
+ fallthrough intact. A user-declared `auto_router:` block keeps its full-
49
+ replacement semantics — swap rules are appended after user rules.
50
+ - **`FallbackEngine.deregister_provider`** — the long-missing inverse of
51
+ `register_provider`; TTL unload now removes the provider from its chain,
52
+ drops the cached adapter (closing its HTTP client), and leaves no dead-port
53
+ entries behind.
54
+ - **Launcher readiness gating** — spawned processes now report a new
55
+ `"loading"` status and are only registered as providers **after** the
56
+ backend passes a readiness probe (`GET /health` for llama.cpp/vllm, TCP
57
+ connect fallback otherwise; `launcher.readiness_timeout_s`, default 300 s).
58
+ Requests can no longer race a model that is still loading.
59
+ *Behavior change*: `POST /api/launcher/start` no longer performs the
60
+ provider sync synchronously (`provider_sync` in the response is always
61
+ `null`); watch `/api/launcher/processes` or the `provider sync:` log line.
62
+ - **Launcher auto-restart (opt-in)** — `launcher.auto_restart: true` enables
63
+ crash recovery with exponential backoff (`auto_restart_max_attempts`,
64
+ default 3); intentional stops (Stop button, shutdown, TTL unload) are
65
+ marked via `ManagedProcess.stopping` and never trigger a restart. Default
66
+ **off**, matching the opt-in stance of `restart_command`. Swap-managed
67
+ processes are excluded — `SwapManager` is their sole supervisor.
68
+ - Tests: `tests/test_launcher_readiness_restart.py` (21),
69
+ `tests/test_launcher_swap.py` (31), `tests/test_launcher_swap_review.py`
70
+ (15 regression tests from the adversarial review). Full suite: 1725 passed.
71
+
72
+ ### Fixed
73
+
74
+ - **Launcher-spawned providers were registered before the model finished
75
+ loading**, so early requests failed against a half-up backend (readiness
76
+ gating above).
77
+ - **Crashed launcher processes stayed `status="error"` forever** with no
78
+ recovery path other than manual restart (auto-restart above).
79
+ - Adversarial-review fixes folded into the initial swap release: enabling
80
+ swap no longer silently discards the bundled auto-router rules; TTL unload
81
+ no longer leaks the generic `launcher-<backend>-<port>` provider (generic
82
+ registration is suppressed for swap-managed processes); swap processes are
83
+ exempt from launcher auto-restart (no dueling supervisors on a fixed
84
+ port); on-demand spawn keys off the **resolved profile**, not the raw
85
+ model string (no wasted spawns when routing goes elsewhere, and
86
+ catalog-mismatched model names hitting a swap profile still take a lease
87
+ so they cannot be unloaded mid-flight).
88
+
89
+ ### Docs
90
+
91
+ - `docs/guides/subagent-routing.md` / `.en.md` — §6.1 measured-verification
92
+ results updated against the 2026-07-11/12 E2E artifacts (3/4 sub-agent
93
+ round trip + rerun evidence, `c6096ed` grok-fix reference, expected-log
94
+ notes), new §5(e) on running the main orchestrator on a 9B-class local
95
+ model (tool-support prerequisite, 9b→30b fallback chain, autocompact
96
+ caveat), §7 UNCONFIRMED items resolved as measured.
97
+ - `docs/designs/launcher-model-swap.md` — full design (phases, concurrency
98
+ model, security posture, §10 review decisions, §10.5 as-built record).
99
+ - `examples/providers.swap.yaml` + `examples/README.md` index row.
100
+
101
+ ---
102
+
103
+ ## [v2.9.0] — 2026-07-11 (agent_cli extraction Phase 2c — in-core adapter removed)
104
+
105
+ **PR #73**. **BREAKING.** Phase 2c of the agent_cli plugin extraction
106
+ (`docs/designs/agent-cli-plugin-extraction.md` §5/§7): the in-core
107
+ `agent_cli` adapter branch is **removed** from `coderouter/adapters/registry.py`.
108
+ `kind: agent_cli` now resolves exclusively through the external plugin
109
+ **`coderouter-plugin-agents`** — the Phase 2b grace period, during which the
110
+ in-core copy still won resolution, has ended.
111
+
112
+ **Who is affected**: anyone with one or more `kind: agent_cli` providers in
113
+ `providers.yaml`. If the plugin isn't installed and enabled, `coderouter
114
+ serve` now fails at startup.
115
+
116
+ **What to do**: install the plugin and enable it —
117
+
118
+ ```bash
119
+ uv pip install "coderouter-plugin-agents @ git+https://github.com/zephel01/coderouter-plugin-agents"
120
+ # or: pip install "coderouter-plugin-agents @ git+https://github.com/zephel01/coderouter-plugin-agents"
121
+ # uv-tool installs of coderouter-cli need the plugin in the same tool env:
122
+ # uv tool install coderouter-cli \
123
+ # --with "coderouter-plugin-agents @ git+https://github.com/zephel01/coderouter-plugin-agents"
124
+ ```
125
+
126
+ ```yaml
127
+ plugins:
128
+ enabled: [agents]
129
+ ```
130
+
131
+ **What is unchanged**: existing `kind: agent_cli` provider entries and the
132
+ `agent_cli:` sub-config (`AgentCliConfig` — schema, fields, defaults) need no
133
+ edits; they remain a stable Core contract per the design's §4.4 case (b).
134
+ Per-CLI behavior (claude/codex/antigravity/grok argv, auth, output parsing)
135
+ is unaffected — only the adapter's Core-vs-plugin wiring changed.
136
+
137
+ **Safety nets**: a `kind: agent_cli` provider without the plugin installed
138
+ and enabled now fails `serve` at startup with a targeted migration hint
139
+ (install command + `plugins.enabled` snippet) rather than a generic
140
+ unknown-kind error, and `coderouter doctor` independently emits a
141
+ config-level warning with the same fix snippet for configs that would hit
142
+ this at startup.
143
+
144
+ ### Removed
145
+
146
+ - **In-core `agent_cli` adapter** (`coderouter/adapters/agent_cli.py`, ~1181
147
+ lines) and the `build_adapter` in-core branch for `kind == "agent_cli"`
148
+ (`coderouter/adapters/registry.py`) — the adapter body, fully moved to
149
+ `coderouter-plugin-agents` 0.1.0 in Phase 2b, is deleted from Core. `kind:
150
+ agent_cli` now resolves only via the plugin-provided-kind lookup path.
151
+ - **`agent-cli-in-core-deprecated` warning** (introduced in Phase 2b,
152
+ `docs/designs/agent-cli-plugin-extraction.md` §5.1) — removed along with
153
+ the in-core branch it guarded; there is nothing left for it to warn about.
154
+
155
+ ### Added
156
+
157
+ - **`coderouter doctor` migration check** — detects a config with one or
158
+ more `kind: agent_cli` providers where `plugins.enabled` does not include
159
+ `agents` (or the plugin isn't installed/discoverable), and emits a
160
+ config-level warning with a ready-to-paste fix snippet
161
+ (`plugins:\n enabled: [agents]` plus the install command).
162
+ - **Targeted unknown-kind / migration hint at `serve` startup** — when
163
+ `build_adapter` cannot resolve `kind: agent_cli` (plugin missing or not
164
+ enabled), the raised error now names the specific migration steps (install
165
+ `coderouter-plugin-agents`, add `plugins.enabled: [agents]`) instead of
166
+ the generic "unknown kind" listing used for arbitrary typos.
167
+
168
+ ### Changed
169
+
170
+ - **`ProviderConfig` / `AgentCliConfig` docstrings and error text**
171
+ (`coderouter/config/schemas.py`) — updated to state plainly that
172
+ `agent_cli` is plugin-served as of v2.9.0 and that the schema itself is
173
+ unaffected.
174
+ - **`Adapter` plugin Protocol docstrings** (`coderouter/plugins/base.py`) —
175
+ updated to drop transitional Phase 2b language (in-core shadowing,
176
+ deprecation warning) now that `agent_cli` resolves solely through the
177
+ plugin path, same as any other plugin-provided `kind`.
178
+
12
179
  ## [v2.8.1] — 2026-07-11 (agent_cli moved to coderouter-plugin-agents — Phase 2b)
13
180
 
14
- Phase 2b of the agent_cli plugin extraction
181
+ **PR #72**. Phase 2b of the agent_cli plugin extraction
15
182
  (`docs/designs/agent-cli-plugin-extraction.md` §4/§5/§7): the adapter body
16
183
  and its behavior tests now live in the new external package
17
184
  **`coderouter-plugin-agents`** (0.1.0, entry point `coderouter.adapter` →
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coderouter-cli
3
- Version: 2.8.1
3
+ Version: 2.9.1
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
@@ -66,7 +66,7 @@ Description-Content-Type: text/markdown
66
66
  ## 何ができるか — 30 秒で
67
67
 
68
68
  ```
69
- あなたのエージェント (Claude Code / gemini-cli / codex)
69
+ あなたのエージェント (Claude Code / codex / agy)
70
70
 
71
71
 
72
72
  ┌─ CodeRouter ─┐
@@ -141,7 +141,7 @@ ANTHROPIC_BASE_URL=http://localhost:8088 ANTHROPIC_AUTH_TOKEN=dummy claude
141
141
  | Claude Code + ローカル Ollama で tool calling が壊れる | **必須** — tool 修復 (+ 必要なら wire 変換) |
142
142
  | Claude Code + ローカルで長時間回すと止まる | **必須級** — 6 系統ガード + self-healing |
143
143
  | Ollama v0.14+ / LM Studio にネイティブ直結で動いてる | **便利** — 直結に無い fallback / ガード / 診断を追加 (passthrough で翻訳ゼロ) |
144
- | codex / gemini-cli + Ollama 直繋ぎで動いてる | オプション — フォールバックが欲しいなら |
144
+ | codex / agy + Ollama 直繋ぎで動いてる | オプション — フォールバックが欲しいなら |
145
145
  | Claude API を直接叩いてて問題ない | 不要 |
146
146
 
147
147
  詳細は → [要否判定ガイド](./docs/start/when-do-i-need-coderouter.md)
@@ -311,6 +311,8 @@ English: [Quickstart](./docs/start/quickstart.en.md) · [Usage guide](./docs/gui
311
311
  - **テスト**: 1,500+ 本(ランタイム依存 5 個は v1 系から不変)
312
312
  - **対応 OS**: macOS (Apple Silicon 推奨) / Linux / Windows WSL2
313
313
  - **対応 backend**: Ollama / llama.cpp / LM Studio / vLLM / MLX-LM / OpenRouter / NVIDIA NIM / Anthropic API
314
+ - **外部エージェント CLI**: `agent_cli` provider として Claude Code / codex / grok / antigravity の4種を束ねて呼び出せる(要 `coderouter-plugin-agents`。詳細 → [external-agents ガイド](./docs/backends/external-agents.md))
315
+ - **プラグイン**: compress / memory / agents の3種を opt-in で追加可能(コアの依存は増えない。一覧・導入方法 → [docs/README.md](./docs/README.md#対応プラグイン--plugins))
314
316
  - **ライセンス**: MIT
315
317
 
316
318
  ---
@@ -21,7 +21,7 @@
21
21
  ## What it does — in 30 seconds
22
22
 
23
23
  ```
24
- Your agent (Claude Code / gemini-cli / codex)
24
+ Your agent (Claude Code / codex / agy)
25
25
 
26
26
 
27
27
  ┌─ CodeRouter ──┐
@@ -77,7 +77,7 @@ That's it. Claude Code works as usual, but your local Ollama is answering behind
77
77
  |---|---|
78
78
  | Claude Code + local Ollama, tool calling breaks | **Yes** — wire translation + tool repair |
79
79
  | Claude Code + local, dies after long sessions | **Helpful** — 6 guards + self-healing |
80
- | codex / gemini-cli + Ollama works fine | Optional — if you want fallback |
80
+ | codex / agy + Ollama works fine | Optional — if you want fallback |
81
81
  | Using Claude API directly, no issues | Not needed |
82
82
 
83
83
  Full decision matrix → [Do I need CodeRouter?](./docs/start/when-do-i-need-coderouter.en.md)
@@ -247,6 +247,8 @@ Open `http://localhost:8088/dashboard` while debugging — most issues become vi
247
247
  - **Tests**: 1,500+ (the 5 runtime deps have never grown since v1)
248
248
  - **OS**: macOS (Apple Silicon recommended) / Linux / Windows WSL2
249
249
  - **Backends**: Ollama / llama.cpp / LM Studio / vLLM / MLX-LM / OpenRouter / NVIDIA NIM / Anthropic API
250
+ - **External agent CLIs**: bundle Claude Code / codex / grok / antigravity as a single `agent_cli` provider (requires `coderouter-plugin-agents`; details → [external-agents guide](./docs/backends/external-agents.en.md))
251
+ - **Plugins**: compress / memory / agents, all opt-in with zero impact on core dependencies (list & install → [docs/README.en.md](./docs/README.en.md#plugins))
250
252
  - **License**: MIT
251
253
 
252
254
  ---
@@ -21,7 +21,7 @@
21
21
  ## 何ができるか — 30 秒で
22
22
 
23
23
  ```
24
- あなたのエージェント (Claude Code / gemini-cli / codex)
24
+ あなたのエージェント (Claude Code / codex / agy)
25
25
 
26
26
 
27
27
  ┌─ CodeRouter ─┐
@@ -96,7 +96,7 @@ ANTHROPIC_BASE_URL=http://localhost:8088 ANTHROPIC_AUTH_TOKEN=dummy claude
96
96
  | Claude Code + ローカル Ollama で tool calling が壊れる | **必須** — tool 修復 (+ 必要なら wire 変換) |
97
97
  | Claude Code + ローカルで長時間回すと止まる | **必須級** — 6 系統ガード + self-healing |
98
98
  | Ollama v0.14+ / LM Studio にネイティブ直結で動いてる | **便利** — 直結に無い fallback / ガード / 診断を追加 (passthrough で翻訳ゼロ) |
99
- | codex / gemini-cli + Ollama 直繋ぎで動いてる | オプション — フォールバックが欲しいなら |
99
+ | codex / agy + Ollama 直繋ぎで動いてる | オプション — フォールバックが欲しいなら |
100
100
  | Claude API を直接叩いてて問題ない | 不要 |
101
101
 
102
102
  詳細は → [要否判定ガイド](./docs/start/when-do-i-need-coderouter.md)
@@ -266,6 +266,8 @@ English: [Quickstart](./docs/start/quickstart.en.md) · [Usage guide](./docs/gui
266
266
  - **テスト**: 1,500+ 本(ランタイム依存 5 個は v1 系から不変)
267
267
  - **対応 OS**: macOS (Apple Silicon 推奨) / Linux / Windows WSL2
268
268
  - **対応 backend**: Ollama / llama.cpp / LM Studio / vLLM / MLX-LM / OpenRouter / NVIDIA NIM / Anthropic API
269
+ - **外部エージェント CLI**: `agent_cli` provider として Claude Code / codex / grok / antigravity の4種を束ねて呼び出せる(要 `coderouter-plugin-agents`。詳細 → [external-agents ガイド](./docs/backends/external-agents.md))
270
+ - **プラグイン**: compress / memory / agents の3種を opt-in で追加可能(コアの依存は増えない。一覧・導入方法 → [docs/README.md](./docs/README.md#対応プラグイン--plugins))
269
271
  - **ライセンス**: MIT
270
272
 
271
273
  ---
@@ -18,12 +18,27 @@ logger = get_logger(__name__)
18
18
  # in-core kinds, in resolution order. Kept as a tuple (not derived from
19
19
  # the if-chain below) so the "Unknown adapter kind" error message and
20
20
  # the plugin-shadow guard have a single source of truth.
21
- _IN_CORE_KINDS: tuple[str, ...] = ("openai_compat", "anthropic", "agent_cli")
22
-
23
- # Module-level flag so the Phase 2b in-core agent_cli deprecation warning
24
- # (docs/designs/agent-cli-plugin-extraction.md §5.1) fires at most once per
25
- # process, regardless of how many agent_cli providers are built.
26
- _agent_cli_deprecation_logged = False
21
+ #
22
+ # Phase 2c (docs/designs/agent-cli-plugin-extraction.md §7 row "2c"):
23
+ # "agent_cli" is no longer in this tuple. It is served exclusively by
24
+ # the coderouter-plugin-agents adapter plugin now that the in-core
25
+ # AgentCliAdapter and its build_adapter branch have been removed.
26
+ _IN_CORE_KINDS: tuple[str, ...] = ("openai_compat", "anthropic")
27
+
28
+ # Phase 2c migration hint (docs/designs/agent-cli-plugin-extraction.md
29
+ # §5.2): shown ONLY for kind="agent_cli" when no plugin resolves it, so
30
+ # operators upgrading from pre-2c configs get a targeted fix instead of
31
+ # the generic unknown-kind message.
32
+ _AGENT_CLI_MIGRATION_HINT = (
33
+ "kind='agent_cli' is served by the coderouter-plugin-agents plugin "
34
+ "(Core no longer ships an in-core agent_cli adapter as of Phase 2c). "
35
+ 'Install it with: pip install "coderouter-plugin-agents @ '
36
+ 'git+https://github.com/zephel01/coderouter-plugin-agents" and add '
37
+ "'agents' to plugins.enabled in providers.yaml, e.g.:\n"
38
+ "plugins:\n"
39
+ " enabled:\n"
40
+ " - agents"
41
+ )
27
42
 
28
43
 
29
44
  def _plugin_kinds(plugin_registry: PluginRegistry | None) -> list[str]:
@@ -33,36 +48,6 @@ def _plugin_kinds(plugin_registry: PluginRegistry | None) -> list[str]:
33
48
  return [factory.kind for factory in plugin_registry.adapters]
34
49
 
35
50
 
36
- def _warn_agent_cli_in_core_deprecated_once() -> None:
37
- """Log ``agent-cli-in-core-deprecated`` once per process (§5.1).
38
-
39
- Only called when the in-core ``agent_cli`` branch is taken AND an
40
- adapter plugin has also registered a ``kind="agent_cli"`` factory —
41
- i.e. the operator already has ``coderouter-plugin-agents`` installed
42
- and enabled, but Core's in-core copy still wins resolution order
43
- (§3.2) during the Phase 2b migration window. Nudges them toward the
44
- plugin path ahead of its Phase 2c removal from Core.
45
- """
46
- global _agent_cli_deprecation_logged
47
- if _agent_cli_deprecation_logged:
48
- return
49
- _agent_cli_deprecation_logged = True
50
- logger.warning(
51
- "agent-cli-in-core-deprecated",
52
- extra={
53
- "hint": (
54
- "an 'agent_cli' adapter plugin is installed and enabled, "
55
- "but Core's in-core agent_cli implementation still served "
56
- "this request (in-core wins resolution during the Phase 2b "
57
- "migration window). The in-core copy will be removed in "
58
- "Phase 2c — no action is required yet, but new setups "
59
- "should already be relying on the plugin path "
60
- "(coderouter-plugin-agents)."
61
- ),
62
- },
63
- )
64
-
65
-
66
51
  def build_adapter(
67
52
  provider: ProviderConfig,
68
53
  plugin_registry: PluginRegistry | None = None,
@@ -72,27 +57,25 @@ def build_adapter(
72
57
  Resolution order (docs/designs/agent-cli-plugin-extraction.md §3.2):
73
58
  in-core kinds first, then plugin-provided kinds, then a fail-fast
74
59
  error. In-core kinds are checked first so a plugin can never shadow
75
- a kind Core itself guarantees (``openai_compat`` / ``anthropic`` /,
76
- during the Phase 2b migration window, ``agent_cli``).
60
+ a kind Core itself guarantees (``openai_compat`` / ``anthropic``).
61
+
62
+ As of Phase 2c, ``agent_cli`` is no longer an in-core kind — it
63
+ resolves ONLY via the plugin path (``coderouter-plugin-agents``).
77
64
  """
78
65
  if provider.kind == "openai_compat":
79
66
  return OpenAICompatAdapter(provider)
80
67
  if provider.kind == "anthropic":
81
68
  return AnthropicAdapter(provider)
82
- if provider.kind == "agent_cli":
83
- # Imported lazily so the external-agent adapter (and its subprocess /
84
- # os plumbing) is only pulled in when a config actually uses it.
85
- from coderouter.adapters.agent_cli import AgentCliAdapter
86
-
87
- if plugin_registry is not None and any(
88
- factory.kind == "agent_cli" for factory in plugin_registry.adapters
89
- ):
90
- _warn_agent_cli_in_core_deprecated_once()
91
- return AgentCliAdapter(provider)
92
69
  if plugin_registry is not None:
93
70
  for factory in plugin_registry.adapters:
94
71
  if factory.kind == provider.kind:
95
72
  return factory.build(provider)
73
+ if provider.kind == "agent_cli":
74
+ # Targeted migration hint (§5.2) instead of the generic message
75
+ # below — this is the single most common post-2c misconfiguration
76
+ # (an un-migrated providers.yaml that still relies on the removed
77
+ # in-core adapter).
78
+ raise ValueError(f"Unknown adapter kind {provider.kind!r}. {_AGENT_CLI_MIGRATION_HINT}")
96
79
  raise ValueError(
97
80
  f"Unknown adapter kind {provider.kind!r}. "
98
81
  f"in-core kinds: {', '.join(_IN_CORE_KINDS)}; "