coderouter-cli 2.7.5__tar.gz → 2.7.7__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 (260) hide show
  1. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/CHANGELOG.md +158 -0
  2. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/PKG-INFO +1 -1
  3. coderouter_cli-2.7.7/coderouter/adapters/agent_cli.py +591 -0
  4. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/adapters/registry.py +6 -0
  5. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/config/schemas.py +162 -3
  6. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/gguf_introspect.py +19 -0
  7. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/launcher_routes.py +215 -20
  8. coderouter_cli-2.7.7/coderouter/launcher_speculative.py +333 -0
  9. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/launcher-quickstart.en.md +2 -0
  10. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/launcher-quickstart.md +2 -0
  11. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/launcher.en.md +55 -1
  12. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/launcher.md +55 -1
  13. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/llamacpp-direct.en.md +26 -0
  14. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/llamacpp-direct.md +26 -0
  15. coderouter_cli-2.7.7/docs/designs/external-agents-adapter.md +606 -0
  16. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/remote-access.en.md +6 -6
  17. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/remote-access.md +6 -6
  18. coderouter_cli-2.7.7/examples/providers-agent-cli.yaml +166 -0
  19. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.llamacpp-vllm.yaml +7 -0
  20. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/pyproject.toml +1 -1
  21. coderouter_cli-2.7.7/tests/test_agent_cli.py +529 -0
  22. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_gguf_introspect.py +25 -0
  23. coderouter_cli-2.7.7/tests/test_launcher_mtp.py +440 -0
  24. coderouter_cli-2.7.7/tests/test_launcher_mtp_fallback.py +272 -0
  25. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/.gitignore +0 -0
  26. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/LICENSE +0 -0
  27. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/README.en.md +0 -0
  28. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/README.md +0 -0
  29. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/__init__.py +0 -0
  30. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/__main__.py +0 -0
  31. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/adapters/__init__.py +0 -0
  32. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/adapters/anthropic_native.py +0 -0
  33. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/adapters/base.py +0 -0
  34. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/adapters/openai_compat.py +0 -0
  35. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/cli.py +0 -0
  36. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/cli_stats.py +0 -0
  37. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/config/__init__.py +0 -0
  38. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/config/capability_registry.py +0 -0
  39. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/config/env_file.py +0 -0
  40. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/config/loader.py +0 -0
  41. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/cost.py +0 -0
  42. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/data/__init__.py +0 -0
  43. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/data/model-capabilities.yaml +0 -0
  44. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/doctor.py +0 -0
  45. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/doctor_apply.py +0 -0
  46. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/env_security.py +0 -0
  47. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/errors.py +0 -0
  48. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/__init__.py +0 -0
  49. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/_fingerprint.py +0 -0
  50. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/backend_health.py +0 -0
  51. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/context_budget.py +0 -0
  52. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/continuous_probe.py +0 -0
  53. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/drift_actions.py +0 -0
  54. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/drift_detection.py +0 -0
  55. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/memory_budget.py +0 -0
  56. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/memory_pressure.py +0 -0
  57. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/self_healing.py +0 -0
  58. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/guards/tool_loop.py +0 -0
  59. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/hardware.py +0 -0
  60. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/__init__.py +0 -0
  61. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/anthropic_routes.py +0 -0
  62. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/app.py +0 -0
  63. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/dashboard_routes.py +0 -0
  64. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/metrics_routes.py +0 -0
  65. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/ingress/openai_routes.py +0 -0
  66. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/language_tax.py +0 -0
  67. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/logging.py +0 -0
  68. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/metrics/__init__.py +0 -0
  69. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/metrics/collector.py +0 -0
  70. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/metrics/prometheus.py +0 -0
  71. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/output_filters.py +0 -0
  72. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/plugins/__init__.py +0 -0
  73. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/plugins/base.py +0 -0
  74. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/plugins/loader.py +0 -0
  75. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/plugins/registry.py +0 -0
  76. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/__init__.py +0 -0
  77. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/adaptive.py +0 -0
  78. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/auto_router.py +0 -0
  79. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/budget.py +0 -0
  80. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/capability.py +0 -0
  81. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/routing/fallback.py +0 -0
  82. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/__init__.py +0 -0
  83. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/audit_log.py +0 -0
  84. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/replay.py +0 -0
  85. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/request_log.py +0 -0
  86. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/store.py +0 -0
  87. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/state/suggest_rules.py +0 -0
  88. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/token_estimation.py +0 -0
  89. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/token_estimation_accurate.py +0 -0
  90. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/translation/__init__.py +0 -0
  91. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/translation/anthropic.py +0 -0
  92. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/translation/convert.py +0 -0
  93. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/coderouter/translation/tool_repair.py +0 -0
  94. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/README.en.md +0 -0
  95. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/README.md +0 -0
  96. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/assets/dashboard-demo.png +0 -0
  97. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
  98. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
  99. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/gguf_dl.en.md +0 -0
  100. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/gguf_dl.md +0 -0
  101. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/hf-ollama-models.en.md +0 -0
  102. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/hf-ollama-models.md +0 -0
  103. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/install-backends.en.md +0 -0
  104. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/install-backends.md +0 -0
  105. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/lmstudio-direct.en.md +0 -0
  106. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/lmstudio-direct.md +0 -0
  107. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/backends/verify-ollama-0.23.1.md +0 -0
  108. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/architecture.en.md +0 -0
  109. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/architecture.md +0 -0
  110. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/context-budget.en.md +0 -0
  111. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/context-budget.md +0 -0
  112. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/continuous-probing.en.md +0 -0
  113. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/continuous-probing.md +0 -0
  114. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/drift-detection.en.md +0 -0
  115. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/drift-detection.md +0 -0
  116. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/partial-stitch.en.md +0 -0
  117. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/concepts/partial-stitch.md +0 -0
  118. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/designs/v1.5-dashboard-mockup.html +0 -0
  119. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/designs/v1.6-auto-router-verification.md +0 -0
  120. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/designs/v1.6-auto-router.md +0 -0
  121. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/free-tier-guide.en.md +0 -0
  122. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/free-tier-guide.md +0 -0
  123. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/language-tax.en.md +0 -0
  124. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/language-tax.md +0 -0
  125. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/security.en.md +0 -0
  126. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/security.md +0 -0
  127. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/troubleshooting.en.md +0 -0
  128. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/troubleshooting.md +0 -0
  129. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/usage-guide.en.md +0 -0
  130. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/guides/usage-guide.md +0 -0
  131. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/low-memory-integration.en.md +0 -0
  132. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/low-memory-integration.md +0 -0
  133. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/openrouter-roster/CHANGES.md +0 -0
  134. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/openrouter-roster/README.md +0 -0
  135. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/openrouter-roster/latest.json +0 -0
  136. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v0.4.md +0 -0
  137. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v0.5-verify.md +0 -0
  138. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v0.5.md +0 -0
  139. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v0.6.md +0 -0
  140. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v0.7.md +0 -0
  141. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v1.0-verify.md +0 -0
  142. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/retrospectives/v1.0.md +0 -0
  143. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/start/quickstart.en.md +0 -0
  144. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/start/quickstart.md +0 -0
  145. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/start/when-do-i-need-coderouter.en.md +0 -0
  146. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/docs/start/when-do-i-need-coderouter.md +0 -0
  147. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/.env.example +0 -0
  148. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/README.md +0 -0
  149. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers-multiagent.yaml +0 -0
  150. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.context-budget-test.yaml +0 -0
  151. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.nvidia-nim.yaml +0 -0
  152. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.ollama-auto-custom.yaml +0 -0
  153. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.ollama-auto.yaml +0 -0
  154. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.ollama-free-chain.yaml +0 -0
  155. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.raspberrypi.yaml +0 -0
  156. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/examples/providers.yaml +0 -0
  157. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/demo_traffic.sh +0 -0
  158. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/openrouter_roster_diff.py +0 -0
  159. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/smoke_v2_2.sh +0 -0
  160. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/verify-providers.yaml +0 -0
  161. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/verify_ollama_0_23.py +0 -0
  162. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/verify_v0_5.sh +0 -0
  163. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/scripts/verify_v1_0.sh +0 -0
  164. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/__init__.py +0 -0
  165. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/conftest.py +0 -0
  166. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_adapter_anthropic.py +0 -0
  167. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_audit_log.py +0 -0
  168. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_auto_router.py +0 -0
  169. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_auto_router_cjk.py +0 -0
  170. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_backend_health.py +0 -0
  171. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_budget.py +0 -0
  172. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_capability.py +0 -0
  173. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_capability_degraded_payload.py +0 -0
  174. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_capability_registry.py +0 -0
  175. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_capability_registry_cache_control.py +0 -0
  176. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_capability_tool_choice.py +0 -0
  177. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_claude_code_suitability.py +0 -0
  178. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_cli.py +0 -0
  179. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_cli_bind_warning.py +0 -0
  180. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_cli_stats.py +0 -0
  181. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_config.py +0 -0
  182. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_config_shim_actions.py +0 -0
  183. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_context_budget.py +0 -0
  184. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_continuous_probe.py +0 -0
  185. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_dashboard_endpoint.py +0 -0
  186. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_doctor.py +0 -0
  187. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_doctor_apply.py +0 -0
  188. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_doctor_cache_probe.py +0 -0
  189. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_drift_actions.py +0 -0
  190. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_drift_detection.py +0 -0
  191. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_drift_detection_integration.py +0 -0
  192. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_env_file.py +0 -0
  193. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_env_security.py +0 -0
  194. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_errors.py +0 -0
  195. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_examples_yaml.py +0 -0
  196. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback.py +0 -0
  197. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_anthropic.py +0 -0
  198. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_cache_control.py +0 -0
  199. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_cache_observed.py +0 -0
  200. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_cache_strip.py +0 -0
  201. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_empty_response.py +0 -0
  202. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_misconfig_warn.py +0 -0
  203. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_paid_gate.py +0 -0
  204. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_thinking.py +0 -0
  205. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fallback_tool_choice_emulate.py +0 -0
  206. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h1_prometheus_drift.py +0 -0
  207. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h2_h6_translation.py +0 -0
  208. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h3_client_reuse.py +0 -0
  209. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h4_h5_guards.py +0 -0
  210. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h7_probe_restore.py +0 -0
  211. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_h8_launcher_auth.py +0 -0
  212. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mA_routing.py +0 -0
  213. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mB_adapters.py +0 -0
  214. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mC_convert.py +0 -0
  215. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mD_logging_metrics.py +0 -0
  216. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mE_config_validation.py +0 -0
  217. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_fix_mF_ingress.py +0 -0
  218. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_guards_tool_loop.py +0 -0
  219. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_hardware.py +0 -0
  220. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_ingress_anthropic.py +0 -0
  221. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_ingress_count_tokens.py +0 -0
  222. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_ingress_profile.py +0 -0
  223. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_language_tax.py +0 -0
  224. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_language_tax_integration.py +0 -0
  225. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_launcher_provider_sync.py +0 -0
  226. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_memory_budget.py +0 -0
  227. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_memory_pressure.py +0 -0
  228. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_cache.py +0 -0
  229. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_collector.py +0 -0
  230. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_cost.py +0 -0
  231. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_endpoint.py +0 -0
  232. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_jsonl.py +0 -0
  233. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_prometheus.py +0 -0
  234. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_metrics_prometheus_cache.py +0 -0
  235. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_models_passthrough.py +0 -0
  236. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_openai_compat.py +0 -0
  237. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_openrouter_roster_diff.py +0 -0
  238. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_output_filters.py +0 -0
  239. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_output_filters_adapters.py +0 -0
  240. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_partial_stitch.py +0 -0
  241. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_plugins_integration.py +0 -0
  242. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_plugins_loader.py +0 -0
  243. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_plugins_registry.py +0 -0
  244. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_reasoning_strip.py +0 -0
  245. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_repair_byte_fallback.py +0 -0
  246. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_request_log.py +0 -0
  247. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_role_normalization.py +0 -0
  248. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_routing_adaptive.py +0 -0
  249. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_self_healing.py +0 -0
  250. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_setup_sh.py +0 -0
  251. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_state_store.py +0 -0
  252. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_token_estimation.py +0 -0
  253. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_token_estimation_accurate.py +0 -0
  254. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_tokens_saved_metric.py +0 -0
  255. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_tool_repair.py +0 -0
  256. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_tool_repair_lenient.py +0 -0
  257. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_tool_repair_r4.py +0 -0
  258. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_toolrepair_bench.py +0 -0
  259. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_translation_anthropic.py +0 -0
  260. {coderouter_cli-2.7.5 → coderouter_cli-2.7.7}/tests/test_translation_reverse.py +0 -0
@@ -9,6 +9,164 @@ are kept verbatim where the Japanese text itself is the subject).
9
9
 
10
10
  ---
11
11
 
12
+ ## [v2.7.7] — 2026-07-10 (External coding agents: agent_cli adapter, Phase 1a claude)
13
+
14
+ **PR #62 / #63**. Adds a new adapter kind, `agent_cli`, that lets CodeRouter front an external
15
+ coding-agent CLI (Claude Code / Codex / Gemini / Grok) as a single one-shot
16
+ `prompt in → text out` transformation, keeping the "one request = one
17
+ stateless transformation" ethos intact even though the underlying CLI is a
18
+ stateful, multi-turn, filesystem-editing control loop. Phase 1a implements
19
+ only the `claude` target (Claude Code CLI) — the most stable of the four and
20
+ the only one that emits `total_cost_usd` directly, making it the reference
21
+ implementation for the parser and cost path. `codex` / `gemini` / `grok` are
22
+ declared in the config schema for forward compatibility but rejected with a
23
+ clear error until their phase lands (Phase 1b-1d).
24
+
25
+ ### Added
26
+
27
+ - **`kind: "agent_cli"` + `AgentCliAdapter`** (`coderouter/adapters/agent_cli.py`,
28
+ new) — invokes the Claude Code CLI one-shot via
29
+ `claude -p --output-format json` (prompt fed on stdin, never on argv, so
30
+ it is never subject to shell interpretation; `shell=True` is never used).
31
+ Key behaviors:
32
+ - Subscription-first OAuth: the child process does NOT inherit the parent
33
+ environment. A minimal env is built explicitly (fixed safe `PATH`,
34
+ `NO_COLOR=1`, `TERM=dumb`, inherited `HOME` for credential-dir
35
+ discovery); `ANTHROPIC_API_KEY` is never forwarded unless the operator
36
+ explicitly lists it in `passthrough_env` (prevents a stray key from
37
+ silently overriding subscription auth). `--bare` is deliberately never
38
+ added — it would skip OAuth/keychain reads.
39
+ - `CODEROUTER_AGENT_DEPTH` recursion guard: the depth is read from the
40
+ environment, incremented, and propagated into the child; `generate()`
41
+ refuses with a non-retryable error once the current depth reaches
42
+ `agent_depth_limit` (default 2).
43
+ - `exec_timeout_s` is enforced independently of `ProviderConfig.timeout_s`
44
+ via `asyncio.wait_for`; on expiry the whole child process *group* is
45
+ `SIGKILL`ed (`start_new_session=True` + `os.killpg`) so the CLI's real
46
+ LLM-call subprocess is never orphaned.
47
+ - Default `read_only` sandbox: `allow_file_writes=False` /
48
+ `sandbox_mode="read_only"` map to claude's `--permission-mode plan`.
49
+ The permission-mode mapping is clamped to read-only whenever
50
+ `allow_file_writes` is False, regardless of `sandbox_mode` (defense in
51
+ depth). `edit` / `full_auto` both map to `acceptEdits`.
52
+ - Pseudo-streaming: no CLI in Phase 1a exposes a stable token stream, so
53
+ `stream()` runs `generate()` once and chunks the final answer into
54
+ content `StreamChunk`s followed by a terminal `finish_reason="stop"`
55
+ chunk carrying usage.
56
+ - `total_cost_usd` (claude's JSON output) propagates to the response as
57
+ the `coderouter_cost_usd` metadata field, feeding the cost dashboard;
58
+ `session_id` similarly surfaces as `coderouter_session_id`.
59
+ - **`AgentCliConfig` schema** (`coderouter/config/schemas.py`) — new
60
+ `ProviderConfig.agent_cli` sub-config (`agent`, `command`, `workdir`,
61
+ `exec_timeout_s`, `allow_file_writes`, `sandbox_mode`, `model`,
62
+ `max_turns`, `passthrough_env`, `agent_depth_limit`), `extra="forbid"`
63
+ like the rest of the module. `ProviderConfig.base_url` is relaxed to
64
+ optional so `agent_cli` providers (which shell out to a local CLI rather
65
+ than calling a URL) can omit it; a `model_validator` restores the
66
+ required-ness of `base_url` for `openai_compat` / `anthropic` and
67
+ requires the `agent_cli` sub-config whenever `kind == "agent_cli"`.
68
+ - **30 new tests** (`tests/test_agent_cli.py`) covering argv construction
69
+ (model/max-turns/permission-mode mapping and the write-clamp), claude JSON
70
+ parsing (success / `is_error` / malformed / missing-field paths), a
71
+ stubbed-subprocess `generate()` path, timeout → process-group kill,
72
+ child-env isolation (no `ANTHROPIC_API_KEY` leak, `passthrough_env`
73
+ allowlist, depth increment), the recursion depth limit, and a TestClient
74
+ end-to-end run through `POST /v1/chat/completions`.
75
+ - New example config: `examples/providers-agent-cli.yaml` — a runnable
76
+ single-provider `agent_cli` setup for `claude`, plus a commented-out
77
+ preview of the future `codex` / `gemini` / `grok` provider blocks.
78
+ - Design doc: `docs/designs/external-agents-adapter.md` — the full Phase 1
79
+ design (architecture, security requirements, per-CLI argv/JSON tables,
80
+ auth policy, test plan). `codex` / `gemini` / `grok` remain Phase
81
+ 1b-1d — configuring `agent_cli.agent` to any of them is accepted at
82
+ config-load time but rejected with a clear, non-retryable error
83
+ (`"agent 'codex' is not implemented in Phase 1a (claude only)"`) when the
84
+ adapter is constructed.
85
+
86
+ ---
87
+
88
+ ### Fixed
89
+
90
+ - **Paid gate blocked the example config** (PR #63): the `ALLOW_PAID` env var
91
+ overrides the yaml `allow_paid`, so the example's `allow_paid: true` was
92
+ silently defeated. Subscription-OAuth claude has zero incremental cost —
93
+ the example now marks the provider `paid: false` (grok stays `paid: true`,
94
+ API-metered).
95
+ - **`Not logged in` under the minimal child env** (PR #63): on macOS the
96
+ Claude Code CLI resolves its Keychain credential via `USER`; the child env
97
+ now inherits `USER`/`LOGNAME` alongside `HOME`. Failures reported as an
98
+ `is_error` result JSON on stdout (exit 1, empty stderr) now surface the
99
+ actual `result` text in provider-failed logs instead of an empty tail.
100
+
101
+ ## [v2.7.6] — 2026-07-09 (Launcher MTP / speculative-decoding support)
102
+
103
+ **PR #59 / #60**. Adds Multi-Token Prediction (MTP) / speculative-decoding
104
+ support to the llama.cpp launcher (both the Web UI and the desktop GUI), closing the
105
+ gap where operators had to hand-assemble `--spec-type` / `--model-draft`
106
+ flags. Fully backward compatible: the new fields default to auto-detection
107
+ with a silent no-op fallback, no config-schema changes, no new dependencies.
108
+
109
+ ### Added
110
+
111
+ - **`resolve_speculative()` / `find_draft_companion()`**
112
+ (`coderouter/launcher_speculative.py`) — shared decision logic for both
113
+ launchers. `mtp_mode="auto"` (default) first checks the selected gguf's
114
+ own metadata for embedded nextn layers (`{arch}.nextn_predict_layers > 0`)
115
+ and, if present, emits `--spec-type draft-mtp` with no separate draft
116
+ model; otherwise it scans the *same folder* as the main gguf for a
117
+ companion draft/MTP file (name hint or shared prefix, size under 50% of
118
+ the main model, architecture-matched when readable) and wires up
119
+ `--spec-type draft-mtp|draft-simple --model-draft <path>`; otherwise it
120
+ starts normally and logs that no companion was found. An explicit
121
+ `draft_model_path` skips detection entirely (400 if the path doesn't
122
+ exist); `mtp_mode="off"` never emits speculative flags. When the operator
123
+ supplies `--spec-type` in extra args, auto-detection defers to it and
124
+ adds nothing.
125
+ Both knobs are llama.cpp-only — vllm/mlx reject them with a 400.
126
+ - **`POST /api/launcher/start`**: new optional `draft_model_path` and
127
+ `mtp_mode` (`"auto"` / `"off"`) fields; the response now carries the
128
+ resolved flags as `"speculative"`. `-md` / `--model-draft` /
129
+ `--spec-draft-model` join the existing `-m`/`--model` denylist for
130
+ `options`/`extra_args` (llama.cpp) — the draft model can only be set via
131
+ `draft_model_path`. The remaining spec knobs (`--spec-type`,
132
+ `--spec-draft-n-max/-n-min/-p-min`, `-ngld`, `-devd`) stay free-form.
133
+ - **GGUF introspection** (`coderouter/gguf_introspect.py`): `GGUFInfo` now
134
+ reports `n_nextn` and the derived `supports_mtp` property, read from
135
+ `{arch}.nextn_predict_layers`.
136
+ - **`--split-mode tensor` crash warning**: known llama.cpp issue #24309 —
137
+ a nextn-embedded model combined with tensor split can crash. The launcher
138
+ detects the combination and logs a warning recommending `--split-mode
139
+ layer` without blocking the launch.
140
+ - **UI**: Web LAUNCH form gets "MTP/draft gguf (空欄で自動検出)" text field
141
+ + "MTP" `auto`/`off` select. Desktop GUI (`launcher_gui.py`) gets the
142
+ matching Entry + a "MTP自動検出" checkbox (default on).
143
+ - **Automatic MTP startup-crash fallback**: when speculative flags were added
144
+ by AUTO detection (`mtp_mode="auto"`, no explicit `draft_model_path`) and the
145
+ backend dies during startup (non-zero exit within ~3 min), the launcher
146
+ relaunches it ONCE without the speculative flags and logs
147
+ `[launcher] MTP startup failure detected (exit code ...); retrying without
148
+ speculative decoding` plus the flag-free command. This covers architectures
149
+ whose `draft-mtp` support in llama.cpp is still immature (detection is right
150
+ but the MTP context fails to initialize, e.g. `failed to measure MTP context
151
+ memory`). Explicit `draft_model_path` / operator-supplied `--spec-type` are
152
+ never auto-retried, and the retry can never loop (single-shot, guarded).
153
+ Implemented in both the Web launcher (`launcher_routes.py`) and the desktop
154
+ GUI (`launcher_gui.py`).
155
+
156
+ ### Docs
157
+
158
+ - `docs/backends/launcher.md`/`.en.md`: new "MTP / speculative decoding"
159
+ section (auto-detection order, companion-file convention, `mtp_mode=off`,
160
+ extra-args deferral, `-md` denylist, issue #24309 caveat, API fields), plus
161
+ the LAUNCH form field table and denylist note updated.
162
+ - `docs/backends/llamacpp-direct.md`/`.en.md`: manual `--spec-type
163
+ draft-mtp` / `--model-draft` / `--spec-draft-n-max` usage example, with a
164
+ pointer to the launcher's auto-detection.
165
+ - `docs/backends/launcher-quickstart.md`/`.en.md`: one-line pointer to the
166
+ new MTP section.
167
+
168
+ ---
169
+
12
170
  ## [v2.7.5] — 2026-07-06 (External-bind startup warning + remote-access guide + docs i18n)
13
171
 
14
172
  Driven by the first field report against the v2.7.0 Host-validation
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coderouter-cli
3
- Version: 2.7.5
3
+ Version: 2.7.7
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