coderouter-cli 2.9.0__tar.gz → 2.9.2__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 (272) hide show
  1. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/CHANGELOG.md +128 -1
  2. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/PKG-INFO +5 -3
  3. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/README.en.md +4 -2
  4. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/README.md +4 -2
  5. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/config/schemas.py +579 -3
  6. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/ingress/app.py +29 -0
  7. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/ingress/launcher_routes.py +476 -147
  8. coderouter_cli-2.9.2/coderouter/launcher_swap.py +466 -0
  9. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/routing/fallback.py +225 -5
  10. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/README.en.md +8 -3
  11. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/README.md +10 -4
  12. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/launcher.en.md +100 -0
  13. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/launcher.md +100 -0
  14. coderouter_cli-2.9.2/docs/designs/launcher-model-swap.md +556 -0
  15. coderouter_cli-2.9.2/docs/guides/subagent-routing.en.md +387 -0
  16. coderouter_cli-2.9.2/docs/guides/subagent-routing.md +387 -0
  17. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/README.md +2 -0
  18. coderouter_cli-2.9.2/examples/providers.swap.yaml +121 -0
  19. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/pyproject.toml +1 -1
  20. coderouter_cli-2.9.2/tests/test_launcher_readiness_restart.py +701 -0
  21. coderouter_cli-2.9.2/tests/test_launcher_swap.py +941 -0
  22. coderouter_cli-2.9.2/tests/test_launcher_swap_review.py +488 -0
  23. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/.gitignore +0 -0
  24. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/LICENSE +0 -0
  25. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/__init__.py +0 -0
  26. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/__main__.py +0 -0
  27. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/adapters/__init__.py +0 -0
  28. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/adapters/anthropic_native.py +0 -0
  29. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/adapters/base.py +0 -0
  30. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/adapters/openai_compat.py +0 -0
  31. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/adapters/registry.py +0 -0
  32. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/cli.py +0 -0
  33. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/cli_stats.py +0 -0
  34. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/config/__init__.py +0 -0
  35. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/config/capability_registry.py +0 -0
  36. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/config/env_file.py +0 -0
  37. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/config/loader.py +0 -0
  38. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/cost.py +0 -0
  39. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/data/__init__.py +0 -0
  40. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/data/model-capabilities.yaml +0 -0
  41. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/doctor.py +0 -0
  42. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/doctor_apply.py +0 -0
  43. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/env_security.py +0 -0
  44. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/errors.py +0 -0
  45. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/gguf_introspect.py +0 -0
  46. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/__init__.py +0 -0
  47. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/_fingerprint.py +0 -0
  48. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/backend_health.py +0 -0
  49. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/context_budget.py +0 -0
  50. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/continuous_probe.py +0 -0
  51. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/drift_actions.py +0 -0
  52. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/drift_detection.py +0 -0
  53. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/memory_budget.py +0 -0
  54. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/memory_pressure.py +0 -0
  55. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/self_healing.py +0 -0
  56. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/guards/tool_loop.py +0 -0
  57. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/hardware.py +0 -0
  58. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/ingress/__init__.py +0 -0
  59. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/ingress/anthropic_routes.py +0 -0
  60. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/ingress/dashboard_routes.py +0 -0
  61. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/ingress/metrics_routes.py +0 -0
  62. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/ingress/openai_routes.py +0 -0
  63. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/language_tax.py +0 -0
  64. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/launcher_speculative.py +0 -0
  65. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/logging.py +0 -0
  66. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/metrics/__init__.py +0 -0
  67. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/metrics/collector.py +0 -0
  68. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/metrics/prometheus.py +0 -0
  69. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/output_filters.py +0 -0
  70. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/plugins/__init__.py +0 -0
  71. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/plugins/base.py +0 -0
  72. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/plugins/loader.py +0 -0
  73. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/plugins/registry.py +0 -0
  74. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/routing/__init__.py +0 -0
  75. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/routing/adaptive.py +0 -0
  76. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/routing/auto_router.py +0 -0
  77. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/routing/budget.py +0 -0
  78. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/routing/capability.py +0 -0
  79. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/state/__init__.py +0 -0
  80. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/state/audit_log.py +0 -0
  81. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/state/replay.py +0 -0
  82. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/state/request_log.py +0 -0
  83. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/state/store.py +0 -0
  84. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/state/suggest_rules.py +0 -0
  85. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/token_estimation.py +0 -0
  86. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/token_estimation_accurate.py +0 -0
  87. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/translation/__init__.py +0 -0
  88. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/translation/anthropic.py +0 -0
  89. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/translation/convert.py +0 -0
  90. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/coderouter/translation/tool_repair.py +0 -0
  91. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/assets/dashboard-demo.png +0 -0
  92. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
  93. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
  94. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/external-agents.en.md +0 -0
  95. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/external-agents.md +0 -0
  96. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/gguf_dl.en.md +0 -0
  97. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/gguf_dl.md +0 -0
  98. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/hf-ollama-models.en.md +0 -0
  99. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/hf-ollama-models.md +0 -0
  100. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/install-backends.en.md +0 -0
  101. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/install-backends.md +0 -0
  102. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/launcher-quickstart.en.md +0 -0
  103. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/launcher-quickstart.md +0 -0
  104. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/llamacpp-direct.en.md +0 -0
  105. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/llamacpp-direct.md +0 -0
  106. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/lmstudio-direct.en.md +0 -0
  107. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/lmstudio-direct.md +0 -0
  108. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/backends/verify-ollama-0.23.1.md +0 -0
  109. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/concepts/architecture.en.md +0 -0
  110. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/concepts/architecture.md +0 -0
  111. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/concepts/context-budget.en.md +0 -0
  112. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/concepts/context-budget.md +0 -0
  113. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/concepts/continuous-probing.en.md +0 -0
  114. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/concepts/continuous-probing.md +0 -0
  115. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/concepts/drift-detection.en.md +0 -0
  116. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/concepts/drift-detection.md +0 -0
  117. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/concepts/partial-stitch.en.md +0 -0
  118. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/concepts/partial-stitch.md +0 -0
  119. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/designs/agent-cli-plugin-extraction.md +0 -0
  120. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/designs/external-agents-adapter.md +0 -0
  121. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/designs/orchestration-companion.md +0 -0
  122. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/designs/v1.5-dashboard-mockup.html +0 -0
  123. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/designs/v1.6-auto-router-verification.md +0 -0
  124. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/designs/v1.6-auto-router.md +0 -0
  125. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/free-tier-guide.en.md +0 -0
  126. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/free-tier-guide.md +0 -0
  127. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/language-tax.en.md +0 -0
  128. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/language-tax.md +0 -0
  129. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/remote-access.en.md +0 -0
  130. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/remote-access.md +0 -0
  131. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/security.en.md +0 -0
  132. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/security.md +0 -0
  133. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/troubleshooting.en.md +0 -0
  134. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/troubleshooting.md +0 -0
  135. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/usage-guide.en.md +0 -0
  136. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/guides/usage-guide.md +0 -0
  137. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/low-memory-integration.en.md +0 -0
  138. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/low-memory-integration.md +0 -0
  139. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/openrouter-roster/CHANGES.md +0 -0
  140. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/openrouter-roster/README.md +0 -0
  141. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/openrouter-roster/latest.json +0 -0
  142. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/retrospectives/v0.4.md +0 -0
  143. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/retrospectives/v0.5-verify.md +0 -0
  144. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/retrospectives/v0.5.md +0 -0
  145. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/retrospectives/v0.6.md +0 -0
  146. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/retrospectives/v0.7.md +0 -0
  147. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/retrospectives/v1.0-verify.md +0 -0
  148. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/retrospectives/v1.0.md +0 -0
  149. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/start/quickstart.en.md +0 -0
  150. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/start/quickstart.md +0 -0
  151. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/start/when-do-i-need-coderouter.en.md +0 -0
  152. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/docs/start/when-do-i-need-coderouter.md +0 -0
  153. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/.env.example +0 -0
  154. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/providers-agent-cli.yaml +0 -0
  155. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/providers-multiagent.yaml +0 -0
  156. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/providers.context-budget-test.yaml +0 -0
  157. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/providers.llamacpp-vllm.yaml +0 -0
  158. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/providers.nvidia-nim.yaml +0 -0
  159. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/providers.ollama-auto-custom.yaml +0 -0
  160. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/providers.ollama-auto.yaml +0 -0
  161. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/providers.ollama-free-chain.yaml +0 -0
  162. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/providers.raspberrypi.yaml +0 -0
  163. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/examples/providers.yaml +0 -0
  164. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/scripts/demo_traffic.sh +0 -0
  165. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/scripts/openrouter_roster_diff.py +0 -0
  166. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/scripts/smoke_v2_2.sh +0 -0
  167. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/scripts/verify-providers.yaml +0 -0
  168. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/scripts/verify_ollama_0_23.py +0 -0
  169. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/scripts/verify_v0_5.sh +0 -0
  170. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/scripts/verify_v1_0.sh +0 -0
  171. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/__init__.py +0 -0
  172. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/conftest.py +0 -0
  173. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_adapter_anthropic.py +0 -0
  174. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_agent_cli.py +0 -0
  175. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_audit_log.py +0 -0
  176. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_auto_router.py +0 -0
  177. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_auto_router_cjk.py +0 -0
  178. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_backend_health.py +0 -0
  179. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_budget.py +0 -0
  180. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_capability.py +0 -0
  181. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_capability_degraded_payload.py +0 -0
  182. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_capability_registry.py +0 -0
  183. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_capability_registry_cache_control.py +0 -0
  184. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_capability_tool_choice.py +0 -0
  185. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_claude_code_suitability.py +0 -0
  186. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_cli.py +0 -0
  187. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_cli_bind_warning.py +0 -0
  188. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_cli_stats.py +0 -0
  189. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_config.py +0 -0
  190. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_config_shim_actions.py +0 -0
  191. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_context_budget.py +0 -0
  192. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_continuous_probe.py +0 -0
  193. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_dashboard_endpoint.py +0 -0
  194. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_doctor.py +0 -0
  195. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_doctor_apply.py +0 -0
  196. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_doctor_cache_probe.py +0 -0
  197. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_drift_actions.py +0 -0
  198. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_drift_detection.py +0 -0
  199. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_drift_detection_integration.py +0 -0
  200. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_env_file.py +0 -0
  201. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_env_security.py +0 -0
  202. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_errors.py +0 -0
  203. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_examples_yaml.py +0 -0
  204. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fallback.py +0 -0
  205. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fallback_anthropic.py +0 -0
  206. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fallback_cache_control.py +0 -0
  207. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fallback_cache_observed.py +0 -0
  208. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fallback_cache_strip.py +0 -0
  209. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fallback_empty_response.py +0 -0
  210. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fallback_misconfig_warn.py +0 -0
  211. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fallback_paid_gate.py +0 -0
  212. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fallback_thinking.py +0 -0
  213. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fallback_tool_choice_emulate.py +0 -0
  214. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_h1_prometheus_drift.py +0 -0
  215. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_h2_h6_translation.py +0 -0
  216. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_h3_client_reuse.py +0 -0
  217. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_h4_h5_guards.py +0 -0
  218. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_h7_probe_restore.py +0 -0
  219. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_h8_launcher_auth.py +0 -0
  220. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_mA_routing.py +0 -0
  221. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_mB_adapters.py +0 -0
  222. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_mC_convert.py +0 -0
  223. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_mD_logging_metrics.py +0 -0
  224. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_mE_config_validation.py +0 -0
  225. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_fix_mF_ingress.py +0 -0
  226. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_gguf_introspect.py +0 -0
  227. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_guards_tool_loop.py +0 -0
  228. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_hardware.py +0 -0
  229. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_ingress_anthropic.py +0 -0
  230. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_ingress_count_tokens.py +0 -0
  231. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_ingress_profile.py +0 -0
  232. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_language_tax.py +0 -0
  233. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_language_tax_integration.py +0 -0
  234. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_launcher_mtp.py +0 -0
  235. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_launcher_mtp_fallback.py +0 -0
  236. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_launcher_provider_sync.py +0 -0
  237. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_memory_budget.py +0 -0
  238. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_memory_pressure.py +0 -0
  239. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_metrics_cache.py +0 -0
  240. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_metrics_collector.py +0 -0
  241. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_metrics_cost.py +0 -0
  242. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_metrics_endpoint.py +0 -0
  243. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_metrics_jsonl.py +0 -0
  244. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_metrics_prometheus.py +0 -0
  245. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_metrics_prometheus_cache.py +0 -0
  246. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_models_passthrough.py +0 -0
  247. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_openai_compat.py +0 -0
  248. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_openrouter_roster_diff.py +0 -0
  249. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_output_filters.py +0 -0
  250. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_output_filters_adapters.py +0 -0
  251. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_partial_stitch.py +0 -0
  252. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_plugin_adapter.py +0 -0
  253. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_plugins_integration.py +0 -0
  254. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_plugins_loader.py +0 -0
  255. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_plugins_registry.py +0 -0
  256. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_reasoning_strip.py +0 -0
  257. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_repair_byte_fallback.py +0 -0
  258. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_request_log.py +0 -0
  259. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_role_normalization.py +0 -0
  260. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_routing_adaptive.py +0 -0
  261. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_self_healing.py +0 -0
  262. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_setup_sh.py +0 -0
  263. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_state_store.py +0 -0
  264. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_token_estimation.py +0 -0
  265. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_token_estimation_accurate.py +0 -0
  266. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_tokens_saved_metric.py +0 -0
  267. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_tool_repair.py +0 -0
  268. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_tool_repair_lenient.py +0 -0
  269. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_tool_repair_r4.py +0 -0
  270. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_toolrepair_bench.py +0 -0
  271. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_translation_anthropic.py +0 -0
  272. {coderouter_cli-2.9.0 → coderouter_cli-2.9.2}/tests/test_translation_reverse.py +0 -0
@@ -9,9 +9,136 @@ are kept verbatim where the Japanese text itself is the subject).
9
9
 
10
10
  ---
11
11
 
12
+ ## [v2.9.2] — 2026-07-12 (config: no more dummy provider for swap-only setups)
13
+
14
+ ### Changed
15
+
16
+ - **`providers` / `profiles` no longer require a dummy entry for swap-only
17
+ deployments.** Both top-level lists were `min_length=1` (or effectively
18
+ required), forcing an unreachable placeholder provider/profile (e.g.
19
+ `base_url: http://127.0.0.1:9`) into any config that only serves models
20
+ through `launcher.swap`. They are now optional (`providers: []` /
21
+ `profiles: []`, or omitted entirely) whenever `launcher.swap.enabled: true`
22
+ and `launcher.swap.models` has at least one entry — the injected
23
+ `launcher-swap-<name>` profile(s) already cover routing, and their
24
+ providers are registered at runtime on first on-demand spawn. Every other
25
+ deployment shape keeps the original fail-fast-at-load guarantee (now
26
+ enforced by `CodeRouterConfig._check_providers_and_profiles_nonempty`
27
+ rather than the field-level `min_length=1` it replaces), with an error
28
+ message pointing at the swap-only exemption. See
29
+ `tests/test_launcher_swap.py`
30
+ (`test_swap_only_config_loads_with_omitted_providers_and_profiles` and
31
+ neighbors) for the minimal swap-only config shape.
32
+
33
+ ### Docs
34
+
35
+ - `docs/backends/launcher.md` / `.en.md` — added the `launcher.swap` (v2.9.1+)
36
+ reference: what it does, a minimal swap-only config (no `providers` /
37
+ `profiles`, verified against the real loader), a `launcher.swap.models[]`
38
+ field table, the Phase 2 schema-only fields, and behavioral notes
39
+ (auto-restart exclusion, streaming lease protection, catalog-miss
40
+ fallthrough, no simultaneous-load cap). Also documented the `launcher:`-level
41
+ `readiness_timeout_s` / `readiness_poll_interval_s` / `auto_restart*` fields
42
+ and the new `loading` process status in the configuration reference
43
+ section, and linked `docs/designs/launcher-model-swap.md` from "Related
44
+ docs" — closing the "残課題" noted in that design doc's §10.5.
45
+
46
+ ---
47
+
48
+ ## [v2.9.1] — 2026-07-12 (launcher model swap Phase 1 — llama-swap-style on-demand models)
49
+
50
+ **New: `launcher.swap`** — an opt-in, dependency-free equivalent of
51
+ [llama-swap](https://github.com/mostlygeek/llama-swap)'s core loop, built on
52
+ the existing embedded Launcher. Declare a static model catalog and CodeRouter
53
+ will **spawn the backing `llama-server` on demand** when a request names the
54
+ model, **hold the request until the backend passes its readiness probe**, and
55
+ **auto-unload the process after an idle TTL** (`swap-unload`, memory returns
56
+ to zero). Only cataloged models can ever be spawned; `model_path` is resolved
57
+ against `launcher.model_dirs` both at config load (fail-fast) and again at
58
+ spawn (defense in depth). Design + as-built record:
59
+ `docs/designs/launcher-model-swap.md`. Sample: `examples/providers.swap.yaml`.
60
+ Verified end-to-end on macOS (M3 Max, Metal): cold spawn → warm reuse →
61
+ catalog-miss fallthrough → TTL unload → respawn, all green
62
+ (`_run/swap-test/` kit).
63
+
64
+ ### Added
65
+
66
+ - **`launcher.swap` config block** (`LauncherSwapConfig` / `SwapModelSpec`):
67
+ `enabled` (default `false` — zero impact until opted in), global
68
+ `ttl_seconds` (default 1800; `null` = never, `0` = unload at last release),
69
+ `readiness_timeout_s`, `sweep_interval_s`, `inject_auto_router_rules`, and
70
+ the static `models:` catalog (`name` / `backend` / `model_path` / fixed
71
+ `port` recommended / `num_ctx` / `extra_args` / speculative fields). Phase 2
72
+ fields (`group`, `est_weights_gb`, `memory_budget_gb`, `max_loaded`) are
73
+ schema-declared but not yet acted on.
74
+ - **`SwapManager`** (`coderouter/launcher_swap.py`): per-model
75
+ `asyncio.Lock` + lease accounting — concurrent requests for the same model
76
+ trigger exactly one spawn; streaming responses hold a lease for their whole
77
+ lifetime (a mid-stream process is never TTL-evicted); a failed spawn resets
78
+ to idle (no poisoning) and the next request retries.
79
+ - **Auto-generated routing**: with `default_profile: auto` and no explicit
80
+ `auto_router:` block, one exact-match rule per catalog model
81
+ (`id: swap:<name>`, `model_pattern = re.escape(name)`) is merged **ahead of
82
+ the bundled heuristics** (an explicitly named swap model beats
83
+ code-fence/image heuristics) while keeping the bundled rules and their
84
+ fallthrough intact. A user-declared `auto_router:` block keeps its full-
85
+ replacement semantics — swap rules are appended after user rules.
86
+ - **`FallbackEngine.deregister_provider`** — the long-missing inverse of
87
+ `register_provider`; TTL unload now removes the provider from its chain,
88
+ drops the cached adapter (closing its HTTP client), and leaves no dead-port
89
+ entries behind.
90
+ - **Launcher readiness gating** — spawned processes now report a new
91
+ `"loading"` status and are only registered as providers **after** the
92
+ backend passes a readiness probe (`GET /health` for llama.cpp/vllm, TCP
93
+ connect fallback otherwise; `launcher.readiness_timeout_s`, default 300 s).
94
+ Requests can no longer race a model that is still loading.
95
+ *Behavior change*: `POST /api/launcher/start` no longer performs the
96
+ provider sync synchronously (`provider_sync` in the response is always
97
+ `null`); watch `/api/launcher/processes` or the `provider sync:` log line.
98
+ - **Launcher auto-restart (opt-in)** — `launcher.auto_restart: true` enables
99
+ crash recovery with exponential backoff (`auto_restart_max_attempts`,
100
+ default 3); intentional stops (Stop button, shutdown, TTL unload) are
101
+ marked via `ManagedProcess.stopping` and never trigger a restart. Default
102
+ **off**, matching the opt-in stance of `restart_command`. Swap-managed
103
+ processes are excluded — `SwapManager` is their sole supervisor.
104
+ - Tests: `tests/test_launcher_readiness_restart.py` (21),
105
+ `tests/test_launcher_swap.py` (31), `tests/test_launcher_swap_review.py`
106
+ (15 regression tests from the adversarial review). Full suite: 1725 passed.
107
+
108
+ ### Fixed
109
+
110
+ - **Launcher-spawned providers were registered before the model finished
111
+ loading**, so early requests failed against a half-up backend (readiness
112
+ gating above).
113
+ - **Crashed launcher processes stayed `status="error"` forever** with no
114
+ recovery path other than manual restart (auto-restart above).
115
+ - Adversarial-review fixes folded into the initial swap release: enabling
116
+ swap no longer silently discards the bundled auto-router rules; TTL unload
117
+ no longer leaks the generic `launcher-<backend>-<port>` provider (generic
118
+ registration is suppressed for swap-managed processes); swap processes are
119
+ exempt from launcher auto-restart (no dueling supervisors on a fixed
120
+ port); on-demand spawn keys off the **resolved profile**, not the raw
121
+ model string (no wasted spawns when routing goes elsewhere, and
122
+ catalog-mismatched model names hitting a swap profile still take a lease
123
+ so they cannot be unloaded mid-flight).
124
+
125
+ ### Docs
126
+
127
+ - `docs/guides/subagent-routing.md` / `.en.md` — §6.1 measured-verification
128
+ results updated against the 2026-07-11/12 E2E artifacts (3/4 sub-agent
129
+ round trip + rerun evidence, `c6096ed` grok-fix reference, expected-log
130
+ notes), new §5(e) on running the main orchestrator on a 9B-class local
131
+ model (tool-support prerequisite, 9b→30b fallback chain, autocompact
132
+ caveat), §7 UNCONFIRMED items resolved as measured.
133
+ - `docs/designs/launcher-model-swap.md` — full design (phases, concurrency
134
+ model, security posture, §10 review decisions, §10.5 as-built record).
135
+ - `examples/providers.swap.yaml` + `examples/README.md` index row.
136
+
137
+ ---
138
+
12
139
  ## [v2.9.0] — 2026-07-11 (agent_cli extraction Phase 2c — in-core adapter removed)
13
140
 
14
- **BREAKING.** Phase 2c of the agent_cli plugin extraction
141
+ **PR #73**. **BREAKING.** Phase 2c of the agent_cli plugin extraction
15
142
  (`docs/designs/agent-cli-plugin-extraction.md` §5/§7): the in-core
16
143
  `agent_cli` adapter branch is **removed** from `coderouter/adapters/registry.py`.
17
144
  `kind: agent_cli` now resolves exclusively through the external plugin
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coderouter-cli
3
- Version: 2.9.0
3
+ Version: 2.9.2
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
  ---