coderouter-cli 2.9.0__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 (272) hide show
  1. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/CHANGELOG.md +92 -1
  2. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/PKG-INFO +5 -3
  3. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/README.en.md +4 -2
  4. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/README.md +4 -2
  5. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/config/schemas.py +523 -1
  6. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/ingress/app.py +29 -0
  7. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/ingress/launcher_routes.py +476 -147
  8. coderouter_cli-2.9.1/coderouter/launcher_swap.py +466 -0
  9. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/routing/fallback.py +225 -5
  10. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/README.en.md +8 -3
  11. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/README.md +10 -4
  12. coderouter_cli-2.9.1/docs/designs/launcher-model-swap.md +556 -0
  13. coderouter_cli-2.9.1/docs/guides/subagent-routing.en.md +387 -0
  14. coderouter_cli-2.9.1/docs/guides/subagent-routing.md +387 -0
  15. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/README.md +2 -0
  16. coderouter_cli-2.9.1/examples/providers.swap.yaml +121 -0
  17. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/pyproject.toml +1 -1
  18. coderouter_cli-2.9.1/tests/test_launcher_readiness_restart.py +701 -0
  19. coderouter_cli-2.9.1/tests/test_launcher_swap.py +782 -0
  20. coderouter_cli-2.9.1/tests/test_launcher_swap_review.py +488 -0
  21. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/.gitignore +0 -0
  22. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/LICENSE +0 -0
  23. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/__init__.py +0 -0
  24. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/__main__.py +0 -0
  25. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/adapters/__init__.py +0 -0
  26. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/adapters/anthropic_native.py +0 -0
  27. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/adapters/base.py +0 -0
  28. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/adapters/openai_compat.py +0 -0
  29. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/adapters/registry.py +0 -0
  30. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/cli.py +0 -0
  31. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/cli_stats.py +0 -0
  32. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/config/__init__.py +0 -0
  33. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/config/capability_registry.py +0 -0
  34. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/config/env_file.py +0 -0
  35. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/config/loader.py +0 -0
  36. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/cost.py +0 -0
  37. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/data/__init__.py +0 -0
  38. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/data/model-capabilities.yaml +0 -0
  39. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/doctor.py +0 -0
  40. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/doctor_apply.py +0 -0
  41. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/env_security.py +0 -0
  42. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/errors.py +0 -0
  43. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/gguf_introspect.py +0 -0
  44. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/__init__.py +0 -0
  45. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/_fingerprint.py +0 -0
  46. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/backend_health.py +0 -0
  47. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/context_budget.py +0 -0
  48. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/continuous_probe.py +0 -0
  49. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/drift_actions.py +0 -0
  50. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/drift_detection.py +0 -0
  51. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/memory_budget.py +0 -0
  52. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/memory_pressure.py +0 -0
  53. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/self_healing.py +0 -0
  54. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/guards/tool_loop.py +0 -0
  55. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/hardware.py +0 -0
  56. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/ingress/__init__.py +0 -0
  57. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/ingress/anthropic_routes.py +0 -0
  58. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/ingress/dashboard_routes.py +0 -0
  59. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/ingress/metrics_routes.py +0 -0
  60. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/ingress/openai_routes.py +0 -0
  61. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/language_tax.py +0 -0
  62. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/launcher_speculative.py +0 -0
  63. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/logging.py +0 -0
  64. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/metrics/__init__.py +0 -0
  65. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/metrics/collector.py +0 -0
  66. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/metrics/prometheus.py +0 -0
  67. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/output_filters.py +0 -0
  68. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/plugins/__init__.py +0 -0
  69. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/plugins/base.py +0 -0
  70. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/plugins/loader.py +0 -0
  71. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/plugins/registry.py +0 -0
  72. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/routing/__init__.py +0 -0
  73. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/routing/adaptive.py +0 -0
  74. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/routing/auto_router.py +0 -0
  75. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/routing/budget.py +0 -0
  76. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/routing/capability.py +0 -0
  77. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/state/__init__.py +0 -0
  78. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/state/audit_log.py +0 -0
  79. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/state/replay.py +0 -0
  80. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/state/request_log.py +0 -0
  81. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/state/store.py +0 -0
  82. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/state/suggest_rules.py +0 -0
  83. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/token_estimation.py +0 -0
  84. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/token_estimation_accurate.py +0 -0
  85. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/translation/__init__.py +0 -0
  86. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/translation/anthropic.py +0 -0
  87. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/translation/convert.py +0 -0
  88. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/coderouter/translation/tool_repair.py +0 -0
  89. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/assets/dashboard-demo.png +0 -0
  90. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
  91. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
  92. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/external-agents.en.md +0 -0
  93. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/external-agents.md +0 -0
  94. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/gguf_dl.en.md +0 -0
  95. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/gguf_dl.md +0 -0
  96. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/hf-ollama-models.en.md +0 -0
  97. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/hf-ollama-models.md +0 -0
  98. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/install-backends.en.md +0 -0
  99. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/install-backends.md +0 -0
  100. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/launcher-quickstart.en.md +0 -0
  101. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/launcher-quickstart.md +0 -0
  102. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/launcher.en.md +0 -0
  103. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/launcher.md +0 -0
  104. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/llamacpp-direct.en.md +0 -0
  105. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/llamacpp-direct.md +0 -0
  106. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/lmstudio-direct.en.md +0 -0
  107. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/lmstudio-direct.md +0 -0
  108. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/backends/verify-ollama-0.23.1.md +0 -0
  109. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/concepts/architecture.en.md +0 -0
  110. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/concepts/architecture.md +0 -0
  111. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/concepts/context-budget.en.md +0 -0
  112. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/concepts/context-budget.md +0 -0
  113. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/concepts/continuous-probing.en.md +0 -0
  114. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/concepts/continuous-probing.md +0 -0
  115. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/concepts/drift-detection.en.md +0 -0
  116. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/concepts/drift-detection.md +0 -0
  117. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/concepts/partial-stitch.en.md +0 -0
  118. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/concepts/partial-stitch.md +0 -0
  119. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/designs/agent-cli-plugin-extraction.md +0 -0
  120. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/designs/external-agents-adapter.md +0 -0
  121. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/designs/orchestration-companion.md +0 -0
  122. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/designs/v1.5-dashboard-mockup.html +0 -0
  123. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/designs/v1.6-auto-router-verification.md +0 -0
  124. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/designs/v1.6-auto-router.md +0 -0
  125. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/free-tier-guide.en.md +0 -0
  126. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/free-tier-guide.md +0 -0
  127. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/language-tax.en.md +0 -0
  128. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/language-tax.md +0 -0
  129. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/remote-access.en.md +0 -0
  130. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/remote-access.md +0 -0
  131. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/security.en.md +0 -0
  132. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/security.md +0 -0
  133. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/troubleshooting.en.md +0 -0
  134. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/troubleshooting.md +0 -0
  135. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/usage-guide.en.md +0 -0
  136. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/guides/usage-guide.md +0 -0
  137. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/low-memory-integration.en.md +0 -0
  138. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/low-memory-integration.md +0 -0
  139. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/openrouter-roster/CHANGES.md +0 -0
  140. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/openrouter-roster/README.md +0 -0
  141. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/openrouter-roster/latest.json +0 -0
  142. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/retrospectives/v0.4.md +0 -0
  143. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/retrospectives/v0.5-verify.md +0 -0
  144. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/retrospectives/v0.5.md +0 -0
  145. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/retrospectives/v0.6.md +0 -0
  146. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/retrospectives/v0.7.md +0 -0
  147. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/retrospectives/v1.0-verify.md +0 -0
  148. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/retrospectives/v1.0.md +0 -0
  149. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/start/quickstart.en.md +0 -0
  150. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/start/quickstart.md +0 -0
  151. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/start/when-do-i-need-coderouter.en.md +0 -0
  152. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/docs/start/when-do-i-need-coderouter.md +0 -0
  153. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/.env.example +0 -0
  154. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/providers-agent-cli.yaml +0 -0
  155. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/providers-multiagent.yaml +0 -0
  156. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/providers.context-budget-test.yaml +0 -0
  157. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/providers.llamacpp-vllm.yaml +0 -0
  158. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/providers.nvidia-nim.yaml +0 -0
  159. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/providers.ollama-auto-custom.yaml +0 -0
  160. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/providers.ollama-auto.yaml +0 -0
  161. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/providers.ollama-free-chain.yaml +0 -0
  162. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/providers.raspberrypi.yaml +0 -0
  163. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/examples/providers.yaml +0 -0
  164. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/scripts/demo_traffic.sh +0 -0
  165. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/scripts/openrouter_roster_diff.py +0 -0
  166. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/scripts/smoke_v2_2.sh +0 -0
  167. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/scripts/verify-providers.yaml +0 -0
  168. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/scripts/verify_ollama_0_23.py +0 -0
  169. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/scripts/verify_v0_5.sh +0 -0
  170. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/scripts/verify_v1_0.sh +0 -0
  171. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/__init__.py +0 -0
  172. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/conftest.py +0 -0
  173. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_adapter_anthropic.py +0 -0
  174. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_agent_cli.py +0 -0
  175. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_audit_log.py +0 -0
  176. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_auto_router.py +0 -0
  177. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_auto_router_cjk.py +0 -0
  178. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_backend_health.py +0 -0
  179. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_budget.py +0 -0
  180. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_capability.py +0 -0
  181. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_capability_degraded_payload.py +0 -0
  182. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_capability_registry.py +0 -0
  183. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_capability_registry_cache_control.py +0 -0
  184. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_capability_tool_choice.py +0 -0
  185. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_claude_code_suitability.py +0 -0
  186. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_cli.py +0 -0
  187. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_cli_bind_warning.py +0 -0
  188. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_cli_stats.py +0 -0
  189. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_config.py +0 -0
  190. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_config_shim_actions.py +0 -0
  191. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_context_budget.py +0 -0
  192. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_continuous_probe.py +0 -0
  193. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_dashboard_endpoint.py +0 -0
  194. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_doctor.py +0 -0
  195. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_doctor_apply.py +0 -0
  196. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_doctor_cache_probe.py +0 -0
  197. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_drift_actions.py +0 -0
  198. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_drift_detection.py +0 -0
  199. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_drift_detection_integration.py +0 -0
  200. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_env_file.py +0 -0
  201. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_env_security.py +0 -0
  202. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_errors.py +0 -0
  203. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_examples_yaml.py +0 -0
  204. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fallback.py +0 -0
  205. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fallback_anthropic.py +0 -0
  206. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fallback_cache_control.py +0 -0
  207. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fallback_cache_observed.py +0 -0
  208. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fallback_cache_strip.py +0 -0
  209. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fallback_empty_response.py +0 -0
  210. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fallback_misconfig_warn.py +0 -0
  211. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fallback_paid_gate.py +0 -0
  212. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fallback_thinking.py +0 -0
  213. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fallback_tool_choice_emulate.py +0 -0
  214. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_h1_prometheus_drift.py +0 -0
  215. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_h2_h6_translation.py +0 -0
  216. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_h3_client_reuse.py +0 -0
  217. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_h4_h5_guards.py +0 -0
  218. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_h7_probe_restore.py +0 -0
  219. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_h8_launcher_auth.py +0 -0
  220. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_mA_routing.py +0 -0
  221. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_mB_adapters.py +0 -0
  222. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_mC_convert.py +0 -0
  223. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_mD_logging_metrics.py +0 -0
  224. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_mE_config_validation.py +0 -0
  225. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_fix_mF_ingress.py +0 -0
  226. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_gguf_introspect.py +0 -0
  227. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_guards_tool_loop.py +0 -0
  228. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_hardware.py +0 -0
  229. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_ingress_anthropic.py +0 -0
  230. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_ingress_count_tokens.py +0 -0
  231. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_ingress_profile.py +0 -0
  232. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_language_tax.py +0 -0
  233. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_language_tax_integration.py +0 -0
  234. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_launcher_mtp.py +0 -0
  235. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_launcher_mtp_fallback.py +0 -0
  236. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_launcher_provider_sync.py +0 -0
  237. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_memory_budget.py +0 -0
  238. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_memory_pressure.py +0 -0
  239. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_metrics_cache.py +0 -0
  240. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_metrics_collector.py +0 -0
  241. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_metrics_cost.py +0 -0
  242. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_metrics_endpoint.py +0 -0
  243. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_metrics_jsonl.py +0 -0
  244. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_metrics_prometheus.py +0 -0
  245. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_metrics_prometheus_cache.py +0 -0
  246. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_models_passthrough.py +0 -0
  247. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_openai_compat.py +0 -0
  248. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_openrouter_roster_diff.py +0 -0
  249. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_output_filters.py +0 -0
  250. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_output_filters_adapters.py +0 -0
  251. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_partial_stitch.py +0 -0
  252. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_plugin_adapter.py +0 -0
  253. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_plugins_integration.py +0 -0
  254. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_plugins_loader.py +0 -0
  255. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_plugins_registry.py +0 -0
  256. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_reasoning_strip.py +0 -0
  257. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_repair_byte_fallback.py +0 -0
  258. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_request_log.py +0 -0
  259. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_role_normalization.py +0 -0
  260. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_routing_adaptive.py +0 -0
  261. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_self_healing.py +0 -0
  262. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_setup_sh.py +0 -0
  263. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_state_store.py +0 -0
  264. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_token_estimation.py +0 -0
  265. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_token_estimation_accurate.py +0 -0
  266. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_tokens_saved_metric.py +0 -0
  267. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_tool_repair.py +0 -0
  268. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_tool_repair_lenient.py +0 -0
  269. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_tool_repair_r4.py +0 -0
  270. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_toolrepair_bench.py +0 -0
  271. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_translation_anthropic.py +0 -0
  272. {coderouter_cli-2.9.0 → coderouter_cli-2.9.1}/tests/test_translation_reverse.py +0 -0
@@ -9,9 +9,100 @@ 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
+
12
103
  ## [v2.9.0] — 2026-07-11 (agent_cli extraction Phase 2c — in-core adapter removed)
13
104
 
14
- **BREAKING.** Phase 2c of the agent_cli plugin extraction
105
+ **PR #73**. **BREAKING.** Phase 2c of the agent_cli plugin extraction
15
106
  (`docs/designs/agent-cli-plugin-extraction.md` §5/§7): the in-core
16
107
  `agent_cli` adapter branch is **removed** from `coderouter/adapters/registry.py`.
17
108
  `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.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
  ---